diff --git a/crypto_scalarmult_ed25519.js b/crypto_scalarmult_ed25519.js index 58d835d..039ebea 100644 --- a/crypto_scalarmult_ed25519.js +++ b/crypto_scalarmult_ed25519.js @@ -256,15 +256,16 @@ function crypto_scalarmult_curve25519 (q, n, p) { ec.fe25519_copy(x3, x1) ec.fe25519_1(z3) - swap = 0 for (pos = 254; pos >= 0; --pos) { - b = t[pos / 8] >> (pos & 7) + b = t[Math.floor(pos / 8)] >> (pos & 7) b &= 1 swap ^= b + ec.fe25519_cswap(x2, x3, swap) ec.fe25519_cswap(z2, z3, swap) swap = b ec.fe25519_sub(tmp0, x3, z3) + ec.fe25519_sub(tmp1, x2, z2) ec.fe25519_add(x2, x2, z2) ec.fe25519_add(z2, x3, z3) @@ -285,6 +286,7 @@ function crypto_scalarmult_curve25519 (q, n, p) { ec.fe25519_mul(z3, x1, z2) ec.fe25519_mul(z2, tmp1, tmp0) } + ec.fe25519_cswap(x2, x3, swap) ec.fe25519_cswap(z2, z3, swap) @@ -306,28 +308,19 @@ function crypto_scalarmult_curve25519_1 (q, n, p) { var pos var swap var b + var _q = Buffer.alloc(32) if (has_small_order(p)) { return -1; } - for (i = 0; i < 32; i++) { - t[i] = n[i] - } + t.set(n) t[0] &= 248 t[31] &= 127 t[31] |= 64 + ec.fe25519_frombytes(x1, p) - ec.fe25519_1(x2) - ec.fe25519_0(z2) - ec.fe25519_copy(x3, x1) - ec.fe25519_1(z3) + swap = ec.scalarmult_curve25519_inner_loop(x1, x2, t) - swap = ec.scalarmult_curve25519_inner_loop(x1, x2, x3, z2, z3, t) - ec.fe25519_cswap(x2, x3, swap) - ec.fe25519_cswap(z2, z3, swap) - - ec.fe25519_invert(z2, z2) - ec.fe25519_mul(x2, x2, z2) ec.fe25519_tobytes(q, x2) return 0 @@ -362,3 +355,12 @@ function crypto_scalarmult_curve25519_base (q, n) { return 0 } + +function print32 (num) { + if (num < 0) return print32(0x100000000 + num) + console.log(num.toString(16).padStart(16, '0')) +} + +function printfe (fe) { + for (let i of fe) print32(i) +} diff --git a/ed-wasm.js b/ed-wasm.js index 02e5d31..bcd3e22 100644 --- a/ed-wasm.js +++ b/ed-wasm.js @@ -1,6 +1,9 @@ const sodium = require('./') +const native = require('sodium-native') const { crypto_scalarmult_ed25519, crypto_scalarmult_ed25519_base, crypto_scalarmult_curve25519, crypto_scalarmult_curve25519_1, crypto_scalarmult_curve25519_base } = require('./crypto_scalarmult_ed25519') const { crypto_sign, crypto_sign_open } = require('./crypto_sign_ed25519') +const sign = require('./crypto_sign') +const ed = require('./ed25519') console.log(crypto_scalarmult_ed25519) let sig = Buffer.alloc(sodium.crypto_sign_BYTES) @@ -17,19 +20,19 @@ let test sig.fill(0) var an = Buffer.from([ - 171, 69, 129, 47, 90, 82, 223, 134, - 6, 147, 54, 76, 55, 148, 252, 37, - 234, 216, 113, 62, 223, 49, 33, 36, - 172, 246, 18, 226, 50, 249, 198, 231 + 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16, 0xc1, + 0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0, + 0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a ]) var bn = Buffer.from([ - 226, 38, 16, 80, 186, 183, 134, 239, - 190, 24, 150, 125, 14, 254, 19, 44, - 55, 112, 156, 5, 141, 230, 91, 84, - 110, 130, 213, 39, 249, 107, 145, 140 + 0x5d, 0xab, 0x08, 0x7e, 0x62, 0x4a, 0x8a, 0x4b, 0x79, 0xe1, 0x7f, + 0x8b, 0x83, 0x80, 0x0e, 0xe6, 0x6f, 0x3b, 0xb1, 0x29, 0x26, 0x18, + 0xb6, 0xfd, 0x1c, 0x2f, 0x8b, 0x27, 0xff, 0x88, 0xe0, 0xeb ]) +var bobpk = Buffer.from('de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f', 'hex') + var cn = Buffer.from([ 190, 24, 150, 125, 14, 254, 19, 44, 55, 112, 156, 5, 141, 230, 91, 84, @@ -79,16 +82,44 @@ var pass = true // if (Buffer.compare(sm, sm1) !== 0 || !pass) console.log('test fails at fixture #' + i) // } -sodium.crypto_scalarmult(res, an, bn) +// ////////////////////////////// +// sodium.crypto_scalarmult(res, an, bn) +// console.log(res.toString('hex')) + +res.fill(0) +crypto_scalarmult_curve25519(res, an, bobpk) console.log(res.toString('hex')) -crypto_scalarmult_ed25519(res, an, bn) +// console.time('whole') +crypto_scalarmult_curve25519_1(res, an, bobpk) +// console.timeEnd('whole') +console.log(res.toString('hex')) + +native.crypto_scalarmult(res, an, bobpk) console.log(res.toString('hex')) sodium.crypto_scalarmult_base(res, an) console.log(res.toString('hex')) -sodium.crypto_scalarmult_base(res, an) +native.crypto_scalarmult_base(res, an) +console.log(res.toString('hex')) + +crypto_scalarmult_curve25519_base(res, an) +console.log(res.toString('hex')) + +native.crypto_scalarmult(res, fixtures[1].sk, fixtures[1].pk) +console.log(res.toString('hex')) + +crypto_scalarmult_curve25519(res, fixtures[1].sk, fixtures[1].pk) +console.log('wasm naive', res.toString('hex')) + +crypto_scalarmult_curve25519_1(res, fixtures[1].sk, fixtures[1].pk) +console.log('wasm inner loop', res.toString('hex')) + +native.crypto_scalarmult(res, fixtures[1].sk, fixtures[1].pk) +console.log('native', res.toString('hex')) + +crypto_scalarmult_ed25519(res, fixtures[1].sk, fixtures[1].pk) console.log(res.toString('hex')) const a = Buffer.alloc(32) @@ -117,6 +148,11 @@ for (let test of fixtures) { } console.timeEnd('wasm') +console.time('native') +for (let test of fixtures) { + native.crypto_scalarmult(res1, test.sk, test.pk) +} +console.timeEnd('native') console.log(res.toString('hex')) console.log(res1.toString('hex')) diff --git a/fe25519_25.js b/fe25519_25.js index fe05ef3..7e9de37 100644 --- a/fe25519_25.js +++ b/fe25519_25.js @@ -1,6 +1,10 @@ const assert = require('nanoassert') const sodium = require('./') +const memory = new WebAssembly.Memory({ initial: 1 }) +const mem = Buffer.from(memory.buffer) +const table = new WebAssembly.Table({ initial: 4, element: "anyfunc" }) + const debug = { log (...args) { console.log(...args.map(int => (int >>> 0).toString(16).padStart(8, '0'))) @@ -14,34 +18,39 @@ const debug = { const importObject = { imports: { js: { - table: new WebAssembly.Table({ initial: 3, element: "anyfunc" }) + table }, debug } } -const wasm_mul = require('./fe25519_25/fe25519_mul')(importObject) -const wasm_sq = require('./fe25519_25/fe25519_sq')(importObject) -const wasm_invert = require('./fe25519_25/fe25519_invert')() +const importWithMemory = { + imports: { + js: { + table, + mem: memory + }, + debug + } +} + +const wasm_mul = require('./fe25519_25/fe25519_mul')(importWithMemory) +const wasm_sq = require('./fe25519_25/fe25519_sq')(importWithMemory) +const wasm_invert = require('./fe25519_25/fe25519_invert')(importWithMemory) const wasm_pow = require('./fe25519_25/fe25519_pow22523')() const wasm_sc_red = require('./fe25519_25/sc_reduce')(importObject) const wasm_sc_mul = require('./fe25519_25/sc25519_mul')(importObject) const wasm_sc_muladd = require('./fe25519_25/sc25519_muladd')(importObject) -const wasm_scalaramult_internal = require('./fe25519_25/scalarmult_curve25519')(importObject) +const wasm_scalaramult_internal = require('./fe25519_25/scalarmult_curve25519')(importWithMemory) function fe25519_invert (h, f) { var buf = new Uint8Array(f.buffer) - wasm_invert.memory.set(buf) - wasm_invert.exports.fe25519_invert(40, 0) + // shared memory - invert takes 280 - 360 + mem.set(buf, 280) + wasm_invert.exports.fe25519_invert(320, 280) - buf = Buffer.from(wasm_invert.memory.slice(40, 80)) - for (let i = 0; i < 10; i++) { - h[i] = buf.readUInt32LE(4 * i) - } - for (let i = 0; i < 10; i++) { - h[i] = buf.readUInt32LE(4 * i) - } + parse_fe(h, mem, 320) } function fe25519_pow22523 (h, f) { @@ -765,14 +774,12 @@ function fe25519_mul (h, f, g) { var fbuf = new Uint8Array(f.buffer) var gbuf = new Uint8Array(g.buffer) - wasm_mul.memory.set(fbuf) - wasm_mul.memory.set(gbuf, 40) + // shared memory, mul takes 0 - 120 + mem.set(fbuf) + mem.set(gbuf, 40) wasm_mul.exports.fe25519_mul(80, 0, 40) - buf = Buffer.from(wasm_mul.memory.slice(80, 120)) - for (let i = 0; i < 10; i++) { - h[i] = buf.readUInt32LE(4 * i) - } + parse_fe(h, mem, 80) } /* @@ -792,13 +799,11 @@ function fe25519_sq (h, f, log) { var buf = new Uint8Array(f.buffer) - wasm_sq.memory.set(buf) - wasm_sq.exports.sq(40, 0, 0) + // shared memory, mul takes 120 - 200 + mem.set(buf, 120) + wasm_sq.exports.sq(160, 120, 0) - buf = Buffer.from(wasm_sq.memory.slice(40, 80)) - for (let i = 0; i < 10; i++) { - h[i] = buf.readUInt32LE(4 * i) - } + parse_fe(h, mem, 160) } /* @@ -818,13 +823,10 @@ function fe25519_sq2 (h, f) { var buf = new Uint8Array(f.buffer) - wasm_sq.memory.set(buf) - wasm_sq.exports.sq(40, 0, 1) + mem.set(buf) + wasm_sq.exports.sq(160, 120, 1) - buf = Buffer.from(wasm_sq.memory.slice(40, 80)) - for (let i = 0; i < 10; i++) { - h[i] = buf.readUInt32LE(4 * i) - } + parse_fe(h, mem, 160) } function fe25519_sqmul (s, n, a) { @@ -971,8 +973,6 @@ function fe25519_unchecked_sqrt (x, x2) { fe25519_sq(m_root2, m_root) fe25519_sub(e, x2, m_root2) fe25519_copy(x, p_root) - console.log(e) - console.log(fe25519_iszero(e)) fe25519_cmov(x, m_root, fe25519_iszero(e)) } @@ -2818,46 +2818,20 @@ function ristretto255_from_hash (s, h) { ristretto255_p3_tobytes(s, p) } -function scalarmult_curve25519_inner_loop (x1, x2, x3, z2, z3, t) { +function scalarmult_curve25519_inner_loop (x1, x2, t) { check_fe(x1) check_fe(x2) - check_fe(x3) - check_fe(z2) - check_fe(z3) assert(t instanceof Uint8Array && t.byteLength === 32) - // printFe(f, 'f') - // printFe(g, 'g') const x1buf = new Uint8Array(x1.buffer) - const x2buf = new Uint8Array(x2.buffer) - const x3buf = new Uint8Array(x3.buffer) - const z2buf = new Uint8Array(z2.buffer) - const z3buf = new Uint8Array(z3.buffer) const tbuf = new Uint8Array(t.buffer) - wasm_scalaramult_internal.memory.set(x1buf, 0) - wasm_scalaramult_internal.memory.set(x2buf, 40) - wasm_scalaramult_internal.memory.set(x3buf, 80) - wasm_scalaramult_internal.memory.set(z2buf, 120) - wasm_scalaramult_internal.memory.set(z3buf, 160) - wasm_scalaramult_internal.memory.set(tbuf, 200) - const swap = wasm_scalaramult_internal.exports.scalarmult(0, 40, 80, 120, 160, 200, 240, 280, 320, 360) + // shared memory, mul takes 200 - 280 + mem.set(x1buf, 200) + mem.set(tbuf, 240) + wasm_scalaramult_internal.exports.scalarmult(280, 200, 240) - buf = Buffer.from(wasm_scalaramult_internal.memory.slice(240, 400)) - for (let i = 0; i < 10; i++) { - x2[i] = buf.readInt32LE(4 * i) - } - for (let i = 10; i < 20; i++) { - x3[i % 10] = buf.readInt32LE(4 * i) - } - for (let i = 20; i < 30; i++) { - z2[i % 10] = buf.readInt32LE(4 * i) - } - for (let i = 30; i < 40; i++) { - z3[i % 10] = buf.readInt32LE(4 * i) - } - - return swap + parse_fe(x2, mem, 280) } function check_fe (h) { @@ -2882,3 +2856,9 @@ function intDivide (a, b) { function signedInt (i) { return i < 0 ? 2 ** 32 + i : i } + +function parse_fe (res, buf, offset = 0) { + for (let i = 0; i < 10; i++) { + res[i] = buf.readInt32LE(4 * i + offset) + } +} diff --git a/fe25519_25/fe25519_invert.js b/fe25519_25/fe25519_invert.js index 2d027e6..816bd0e 100644 --- a/fe25519_25/fe25519_invert.js +++ b/fe25519_25/fe25519_invert.js @@ -7,7 +7,7 @@ function loadWebAssembly (opts) { if (!loadWebAssembly.supported) return null var imp = opts && opts.imports - var wasm = toUint8Array('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') + var wasm = toUint8Array('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') var ready = null var mod = { diff --git a/fe25519_25/fe25519_invert.wat b/fe25519_25/fe25519_invert.wat index 5bb7223..e1fc691 100644 --- a/fe25519_25/fe25519_invert.wat +++ b/fe25519_25/fe25519_invert.wat @@ -1,6 +1,8 @@ (module - (memory $0 1) - (export "memory" (memory $0)) + (import "js" "table" (table 3 anyfunc)) + (import "js" "mem" (memory 1)) + + (elem (i32.const 3) $invert) (global $tmp0 (mut i64) (i64.const 0)) (global $tmp1 (mut i64) (i64.const 0)) @@ -372,17 +374,18 @@ (set_global $tmp1 (i64.add (get_global $tmp1) (get_local $carry0))) (set_global $tmp0 (i64.sub (get_global $tmp0) (i64.mul (get_local $carry0) (i64.shl (i64.const 1) (i64.const 26)))))) - (func $fe25519_invert (export "fe25519_invert") (param $out i32) (param $f i32) - (local $f0 i64) - (local $f1 i64) - (local $f2 i64) - (local $f3 i64) - (local $f4 i64) - (local $f5 i64) - (local $f6 i64) - (local $f7 i64) - (local $f8 i64) - (local $f9 i64) + (func $invert + (param $f0 i64) + (param $f1 i64) + (param $f2 i64) + (param $f3 i64) + (param $f4 i64) + (param $f5 i64) + (param $f6 i64) + (param $f7 i64) + (param $f8 i64) + (param $f9 i64) + (param $out i32) (local $i i32) @@ -397,17 +400,6 @@ (local $t0_8 i64) (local $t1_8 i64) (local $t2_8 i64) (local $t0_9 i64) (local $t1_9 i64) (local $t2_9 i64) - (set_local $f0 (i64.load32_u offset=0 (get_local $f))) - (set_local $f1 (i64.load32_u offset=4 (get_local $f))) - (set_local $f2 (i64.load32_u offset=8 (get_local $f))) - (set_local $f3 (i64.load32_u offset=12 (get_local $f))) - (set_local $f4 (i64.load32_u offset=16 (get_local $f))) - (set_local $f5 (i64.load32_u offset=20 (get_local $f))) - (set_local $f6 (i64.load32_u offset=24 (get_local $f))) - (set_local $f7 (i64.load32_u offset=28 (get_local $f))) - (set_local $f8 (i64.load32_u offset=32 (get_local $f))) - (set_local $f9 (i64.load32_u offset=36 (get_local $f))) - (set_local $f0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f0)))) (set_local $f1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f1)))) (set_local $f2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f2)))) @@ -1115,4 +1107,19 @@ (i64.store32 offset=24 (get_local $out) (get_global $tmp6)) (i64.store32 offset=28 (get_local $out) (get_global $tmp7)) (i64.store32 offset=32 (get_local $out) (get_global $tmp8)) - (i64.store32 offset=36 (get_local $out) (get_global $tmp9)))) + (i64.store32 offset=36 (get_local $out) (get_global $tmp9))) + + (func $fe25519_invert (export "fe25519_invert") (param $out i32) (param $f i32) + (i64.load32_u offset=0 (get_local $f)) + (i64.load32_u offset=4 (get_local $f)) + (i64.load32_u offset=8 (get_local $f)) + (i64.load32_u offset=12 (get_local $f)) + (i64.load32_u offset=16 (get_local $f)) + (i64.load32_u offset=20 (get_local $f)) + (i64.load32_u offset=24 (get_local $f)) + (i64.load32_u offset=28 (get_local $f)) + (i64.load32_u offset=32 (get_local $f)) + (i64.load32_u offset=36 (get_local $f)) + (get_local $out) + (call $invert))) + diff --git a/fe25519_25/fe25519_mul.js b/fe25519_25/fe25519_mul.js index 826c4c6..6593916 100644 --- a/fe25519_25/fe25519_mul.js +++ b/fe25519_25/fe25519_mul.js @@ -6,8 +6,8 @@ loadWebAssembly.supported = typeof WebAssembly !== 'undefined' function loadWebAssembly (opts) { if (!loadWebAssembly.supported) return null - var imp = opts && opts.imports || { imports: {} } - var wasm = toUint8Array('AGFzbQEAAAABHwJgFX5+fn5+fn5+fn5+fn5+fn5+fn5+fwBgA39/fwACDgECanMFdGFibGUBcAABAwMCAAEFAwEAAQcYAgZtZW1vcnkCAAtmZTI1NTE5X211bAABCQcBAEEBCwEACv4QApAQAYYBfiAAp6whACABp6whASACp6whAiADp6whAyAEp6whBCAFp6whBSAGp6whBiAHp6whByAIp6whCCAJp6whCSAKp6whCiALp6whCyAMp6whDCANp6whDSAOp6whDiAPp6whDyAQp6whECARp6whESASp6whEiATp6whE0ITIAt+IAtCgICAgAiDQgGGQhN+fSEpQhMgDH4gDEKAgICACINCAYZCE359ISpCEyANfiANQoCAgIAIg0IBhkITfn0hK0ITIA5+IA5CgICAgAiDQgGGQhN+fSEsQhMgD34gD0KAgICACINCAYZCE359IS1CEyAQfiAQQoCAgIAIg0IBhkITfn0hLkITIBF+IBFCgICAgAiDQgGGQhN+fSEvQhMgEn4gEkKAgICACINCAYZCE359ITBCEyATfiATQoCAgIAIg0IBhkITfn0hMUICIAF+IAFCgICAgAiDQgGGQgJ+fSEyQgIgA34gA0KAgICACINCAYZCAn59ITNCAiAFfiAFQoCAgIAIg0IBhkICfn0hNEICIAd+IAdCgICAgAiDQgGGQgJ+fSE1QgIgCX4gCUKAgICACINCAYZCAn59ITYgKaesISkgKqesISogK6esISsgLKesISwgLaesIS0gLqesIS4gL6esIS8gMKesITAgMaesITEgMqesITIgM6esITMgNKesITQgNaesITUgNqesITYgACAKfiE3IAAgC34hOCAAIAx+ITkgACANfiE6IAAgDn4hOyAAIA9+ITwgACAQfiE9IAAgEX4hPiAAIBJ+IT8gACATfiFAIAEgCn4hQSAyIAt+IUIgASAMfiFDIDIgDX4hRCABIA5+IUUgMiAPfiFGIAEgEH4hRyAyIBF+IUggASASfiFJIDIgMX4hSiACIAp+IUsgAiALfiFMIAIgDH4hTSACIA1+IU4gAiAOfiFPIAIgD34hUCACIBB+IVEgAiARfiFSIAIgMH4hUyACIDF+IVQgAyAKfiFVIDMgC34hViADIAx+IVcgMyANfiFYIAMgDn4hWSAzIA9+IVogAyAQfiFbIDMgL34hXCADIDB+IV0gMyAxfiFeIAQgCn4hXyAEIAt+IWAgBCAMfiFhIAQgDX4hYiAEIA5+IWMgBCAPfiFkIAQgLn4hZSAEIC9+IWYgBCAwfiFnIAQgMX4haCAFIAp+IWkgNCALfiFqIAUgDH4hayA0IA1+IWwgBSAOfiFtIDQgLX4hbiAFIC5+IW8gNCAvfiFwIAUgMH4hcSA0IDF+IXIgBiAKfiFzIAYgC34hdCAGIAx+IXUgBiANfiF2IAYgLH4hdyAGIC1+IXggBiAufiF5IAYgL34heiAGIDB+IXsgBiAxfiF8IAcgCn4hfSA1IAt+IX4gByAMfiF/IDUgK34hgAEgByAsfiGBASA1IC1+IYIBIAcgLn4hgwEgNSAvfiGEASAHIDB+IYUBIDUgMX4hhgEgCCAKfiGHASAIIAt+IYgBIAggKn4hiQEgCCArfiGKASAIICx+IYsBIAggLX4hjAEgCCAufiGNASAIIC9+IY4BIAggMH4hjwEgCCAxfiGQASAJIAp+IZEBIDYgKX4hkgEgCSAqfiGTASA2ICt+IZQBIAkgLH4hlQEgNiAtfiGWASAJIC5+IZcBIDYgL34hmAEgCSAwfiGZASA2IDF+IZoBIDcgSiBTIFwgZSBuIHcggAEgiQEgkgF8fHx8fHx8fHwhFSA4IEEgVCBdIGYgbyB4IIEBIIoBIJMBfHx8fHx8fHx8IRYgOSBCIEsgXiBnIHAgeSCCASCLASCUAXx8fHx8fHx8fCEXIDogQyBMIFUgaCBxIHoggwEgjAEglQF8fHx8fHx8fHwhGCA7IEQgTSBWIF8gciB7IIQBII0BIJYBfHx8fHx8fHx8IRkgPCBFIE4gVyBgIGkgfCCFASCOASCXAXx8fHx8fHx8fCEaID0gRiBPIFggYSBqIHMghgEgjwEgmAF8fHx8fHx8fHwhGyA+IEcgUCBZIGIgayB0IH0gkAEgmQF8fHx8fHx8fHwhHCA/IEggUSBaIGMgbCB1IH4ghwEgmgF8fHx8fHx8fHwhHSBAIEkgUiBbIGQgbSB2IH8giAEgkQF8fHx8fHx8fHwhHiAVQgFCGYZ8QhqHIR8gFiAffCEWIBUgH0IBQhqGfn0hFSAZQgFCGYZ8QhqHISMgGiAjfCEaIBkgI0IBQhqGfn0hGSAWQgFCGIZ8QhmHISAgFyAgfCEXIBYgIEIBQhmGfn0hFiAaQgFCGIZ8QhmHISQgGyAkfCEbIBogJEIBQhmGfn0hGiAXQgFCGYZ8QhqHISEgGCAhfCEYIBcgIUIBQhqGfn0hFyAbQgFCGYZ8QhqHISUgHCAlfCEcIBsgJUIBQhqGfn0hGyAYQgFCGIZ8QhmHISIgGSAifCEZIBggIkIBQhmGfn0hGCAcQgFCGIZ8QhmHISYgHSAmfCEdIBwgJkIBQhmGfn0hHCAZQgFCGYZ8QhqHISMgGiAjfCEaIBkgI0IBQhqGfn0hGSAdQgFCGYZ8QhqHIScgHiAnfCEeIB0gJ0IBQhqGfn0hHSAeQgFCGIZ8QhmHISggFSAoQhN+fCEVIB4gKEIBQhmGfn0hHiAVQgFCGYZ8QhqHIR8gFiAffCEWIBUgH0IBQhqGfn0hFSAUIBU+AgAgFCAWPgIEIBQgFz4CCCAUIBg+AgwgFCAZPgIQIBQgGj4CFCAUIBs+AhggFCAcPgIcIBQgHT4CICAUIB4+AiQLagAgATUCACABNQIEIAE1AgggATUCDCABNQIQIAE1AhQgATUCGCABNQIcIAE1AiAgATUCJCACNQIAIAI1AgQgAjUCCCACNQIMIAI1AhAgAjUCFCACNQIYIAI1AhwgAjUCICACNQIkIAAQAAs=') + var imp = opts && opts.imports + var wasm = toUint8Array('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') var ready = null var mod = { @@ -39,7 +39,6 @@ function loadWebAssembly (opts) { if (opts && opts.async) throw new Error('async') setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) } catch (err) { - console.log(err) ready = WebAssembly.instantiate(wasm, imp).then(setup) } diff --git a/fe25519_25/fe25519_mul.wat b/fe25519_25/fe25519_mul.wat index 41fa0f3..a899a59 100644 --- a/fe25519_25/fe25519_mul.wat +++ b/fe25519_25/fe25519_mul.wat @@ -1,5 +1,7 @@ (module (import "js" "table" (table 1 anyfunc)) + (import "js" "mem" (memory 1)) + (elem (i32.const 1) $fe_mul) ;; (func $i32.log (import "debug" "log") (param i32)) @@ -11,10 +13,7 @@ ;; (func $f32.log (import "debug" "log") (param f32)) ;; (func $f32.log_tee (import "debug" "log_tee") (param f32) (result f32)) ;; (func $f64.log (import "debug" "log") (param f64)) - ;; (func $f64.log_tee (import "debug" "log_tee") (param f64) (result f64)) - - (memory $0 1) - (export "memory" (memory $0)) + ;; (func $f64.log_tee (import "debug" "log_tee") (param f64) (result f64)) ;; ;; i64 logging by splitting into two i32 limbs ;; (func $i64.log diff --git a/fe25519_25/fe25519_sq.js b/fe25519_25/fe25519_sq.js index 6dae2d7..b1d33e6 100644 --- a/fe25519_25/fe25519_sq.js +++ b/fe25519_25/fe25519_sq.js @@ -7,7 +7,7 @@ function loadWebAssembly (opts) { if (!loadWebAssembly.supported) return null var imp = opts && opts.imports - var wasm = toUint8Array('AGFzbQEAAAABGAJgDX5+fn5+fn5+fn5/f38AYAR/f39/AAIOAQJqcwV0YWJsZQFwAAEDAwIAAQUDAQABBw8CBm1lbW9yeQIAAnNxAAEJBwEAQQILAQAKxgoChgoCAX9ZfgJAA0AgAKesIQAgAaesIQEgAqesIQIgA6esIQMgBKesIQQgBaesIQUgBqesIQYgB6esIQcgCKesIQggCaesIQkgAEICfiEjIAFCAn4hJCACQgJ+ISUgA0ICfiEmIARCAn4hJyAFQgJ+ISggBkICfiEpIAdCAn4hKiAFQiZ+ISsgBkITfiEsIAdCJn4hLSAIQhN+IS4gCUImfiEvIAAgAH4hMCAjIAF+ITEgIyACfiEyICMgA34hMyAjIAR+ITQgIyAFfiE1ICMgBn4hNiAjIAd+ITcgIyAIfiE4ICMgCX4hOSAkIAF+ITogJCACfiE7ICQgJn4hPCAkIAR+IT0gJCAofiE+ICQgBn4hPyAkICp+IUAgJCAIfiFBICQgL34hQiACIAJ+IUMgJSADfiFEICUgBH4hRSAlIAV+IUYgJSAGfiFHICUgB34hSCAlIC5+IUkgAiAvfiFKICYgA34hSyAmIAR+IUwgJiAofiFNICYgBn4hTiAmIC1+IU8gJiAufiFQICYgL34hUSAEIAR+IVIgJyAFfiFTICcgLH4hVCAEIC1+IVUgJyAufiFWIAQgL34hVyAFICt+IVggKCAsfiFZICggLX4hWiAoIC5+IVsgKCAvfiFcIAYgLH4hXSAGIC1+IV4gKSAufiFfIAYgL34hYCAHIC1+IWEgKiAufiFiICogL34hYyAIIC5+IWQgCCAvfiFlIAkgL34hZiAwIEIgSSBPIFQgWHx8fHx8IQ8gMSBKIFAgVSBZfHx8fCEQIDIgOiBRIFYgWiBdfHx8fHwhESAzIDsgVyBbIF58fHx8IRIgNCA8IEMgXCBfIGF8fHx8fCETIDUgPSBEIGAgYnx8fHwhFCA2ID4gRSBLIGMgZHx8fHx8IRUgNyA/IEYgTCBlfHx8fCEWIDggQCBHIE0gUiBmfHx8fHwhFyA5IEEgSCBOIFN8fHx8IRggDSALRg0BIA1BAWohDQwACwsgCkEBRgRAIA8gD3whDyAQIBB8IRAgESARfCERIBIgEnwhEiATIBN8IRMgFCAUfCEUIBUgFXwhFSAWIBZ8IRYgFyAXfCEXIBggGHwhGAsgD0IBQhmGfEIahyEZIBAgGXwhECAPIBlCAUIahn59IQ8gE0IBQhmGfEIahyEdIBQgHXwhFCATIB1CAUIahn59IRMgEEIBQhiGfEIZhyEaIBEgGnwhESAQIBpCAUIZhn59IRAgFEIBQhiGfEIZhyEeIBUgHnwhFSAUIB5CAUIZhn59IRQgEUIBQhmGfEIahyEbIBIgG3whEiARIBtCAUIahn59IREgFUIBQhmGfEIahyEfIBYgH3whFiAVIB9CAUIahn59IRUgEkIBQhiGfEIZhyEcIBMgHHwhEyASIBxCAUIZhn59IRIgFkIBQhiGfEIZhyEgIBcgIHwhFyAWICBCAUIZhn59IRYgE0IBQhmGfEIahyEdIBQgHXwhFCATIB1CAUIahn59IRMgF0IBQhmGfEIahyEhIBggIXwhGCAXICFCAUIahn59IRcgGEIBQhiGfEIZhyEiIA8gIkITfnwhDyAYICJCAUIZhn59IRggD0IBQhmGfEIahyEZIBAgGXwhECAPIBlCAUIahn59IQ8gDCAPPgIAIAwgED4CBCAMIBE+AgggDCASPgIMIAwgEz4CECAMIBQ+AhQgDCAVPgIYIAwgFj4CHCAMIBc+AiAgDCAYPgIkCzwAIAA1AgAgADUCBCAANQIIIAA1AgwgADUCECAANQIUIAA1AhggADUCHCAANQIgIAA1AiQgASACIAMQAAs=') + var wasm = toUint8Array('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') var ready = null var mod = { diff --git a/fe25519_25/fe25519_sq.wat b/fe25519_25/fe25519_sq.wat index 1cfba23..70d81bd 100644 --- a/fe25519_25/fe25519_sq.wat +++ b/fe25519_25/fe25519_sq.wat @@ -1,9 +1,36 @@ (module (import "js" "table" (table 1 anyfunc)) + (import "js" "mem" (memory 1)) + (elem (i32.const 2) $fe_sq) - (memory $0 1) - (export "memory" (memory $0)) + (func $i32.log (import "debug" "log") (param i32)) + (func $i32.log_tee (import "debug" "log_tee") (param i32) (result i32)) + ;; No i64 interop with JS yet - but maybe coming with WebAssembly BigInt + ;; So we can instead fake this by splitting the i64 into two i32 limbs, + ;; however these are WASM functions using i32x2.log: + (func $i32x2.log (import "debug" "log") (param i32) (param i32)) + (func $f32.log (import "debug" "log") (param f32)) + (func $f32.log_tee (import "debug" "log_tee") (param f32) (result f32)) + (func $f64.log (import "debug" "log") (param f64)) + (func $f64.log_tee (import "debug" "log_tee") (param f64) (result f64)) + + ;; i64 logging by splitting into two i32 limbs + (func $i64.log + (param $0 i64) + (call $i32x2.log + ;; Upper limb + (i32.wrap/i64 + (i64.shr_s (get_local $0) + (i64.const 32))) + ;; Lower limb + (i32.wrap/i64 (get_local $0)))) + + (func $i64.log_tee + (param $0 i64) + (result i64) + (call $i64.log (get_local $0)) + (return (get_local $0))) (func $fe_sq (param $f0 i64) @@ -19,7 +46,7 @@ (param $double i32) (param $repeat i32) - + (param $h i32) (local $count i32) @@ -284,7 +311,7 @@ (i64.store32 offset=32 (get_local $h) (get_local $h8)) (i64.store32 offset=36 (get_local $h) (get_local $h9))) - (func $sq (export "sq") (param $f i32) (param $double i32) (param $repeat i32) (param $h i32) + (func $sq (export "sq") (param $h i32) (param $f i32) (param $double i32) (param $repeat i32) (i64.load32_u offset=0 (get_local $f)) (i64.load32_u offset=4 (get_local $f)) (i64.load32_u offset=8 (get_local $f)) diff --git a/fe25519_25/scalarmult_curve25519.js b/fe25519_25/scalarmult_curve25519.js index 66eefbb..6932f28 100644 --- a/fe25519_25/scalarmult_curve25519.js +++ b/fe25519_25/scalarmult_curve25519.js @@ -7,7 +7,7 @@ function loadWebAssembly (opts) { if (!loadWebAssembly.supported) return null var imp = opts && opts.imports - var wasm = toUint8Array('AGFzbQEAAAABYAxgFX5+fn5+fn5+fn5+fn5+fn5+fn5+fwBgDX5+fn5+fn5+fn5/f38AYAF/AGABfwF/YAJ/fwBgAX0AYAF9AX1gAXwAYAF8AXxgAX4AYAF+AX5gCn9/f39/f39/f38BfwJuCAJqcwV0YWJsZQFwAAMFZGVidWcDbG9nAAIFZGVidWcHbG9nX3RlZQADBWRlYnVnA2xvZwAEBWRlYnVnA2xvZwAFBWRlYnVnB2xvZ190ZWUABgVkZWJ1ZwNsb2cABwVkZWJ1Zwdsb2dfdGVlAAgDBAMJCgsFAwEAAQcXAgZtZW1vcnkCAApzY2FsYXJtdWx0AAkK8RYDDQAgAEIgh6cgAKcQAgsJACAAEAcgAA8L1hYCB39MfiAFKQMAIRMgBSkDCCEUIAUpAxAhFSAFKQMYIRYgADUCACEXIAA1AgQhGCAANQIIIRkgADUCDCEaIAA1AhAhGyAANQIUIRwgADUCGCEdIAA1AhwhHiAANQIgIR8gADUCJCEgIAE1AgAhISABNQIEISIgATUCCCEjIAE1AgwhJCABNQIQISUgATUCFCEmIAE1AhghJyABNQIcISggATUCICEpIAE1AiQhKiACNQIAITUgAjUCBCE2IAI1AgghNyACNQIMITggAjUCECE5IAI1AhQhOiACNQIYITsgAjUCHCE8IAI1AiAhPSACNQIkIT4gAzUCACErIAM1AgQhLCADNQIIIS0gAzUCDCEuIAM1AhAhLyADNQIUITAgAzUCGCExIAM1AhwhMiADNQIgITMgAzUCJCE0IAQ1AgAhPyAENQIEIUAgBDUCCCFBIAQ1AgwhQiAENQIQIUMgBDUCFCFEIAQ1AhghRSAENQIcIUYgBDUCICFHIAQ1AiQhSEH+ASEMAkADQCAMQQBIDQECQAJAAkACQAJAAkAgDEHAAG4OAwECAwQLIBYhEgwECyAWIRIMAwsgFiESDAILIBYhEgwBCwsgEiAMQQhuQcAAcK2IQv8BgyAMQQdxrYhCAYOnIQsgCiALcyEKQQAgCmutIREgISA1hSARgyFJICIgNoUgEYMhSiAjIDeFIBGDIUsgJCA4hSARgyFMICUgOYUgEYMhTSAmIDqFIBGDIU4gJyA7hSARgyFPICggPIUgEYMhUCApID2FIBGDIVEgKiA+hSARgyFSICEgSYUhISAhIEmFISEgIiBKhSEiICMgS4UhIyAkIEyFISQgJSBNhSElICYgToUhJiAnIE+FIScgKCBQhSEoICkgUYUhKSAqIFKFISogNSBJhSE1IDUgSYUhNSA2IEqFITYgNyBLhSE3IDggTIUhOCA5IE2FITkgOiBOhSE6IDsgT4UhOyA8IFCFITwgPSBRhSE9ID4gUoUhPiA/ICuFIBGDIUkgQCAshSARgyFKIEEgLYUgEYMhSyBCIC6FIBGDIUwgQyAvhSARgyFNIEQgMIUgEYMhTiBFIDGFIBGDIU8gRiAyhSARgyFQIEcgM4UgEYMhUSBIIDSFIBGDIVIgKyBJhSErICsgSYUhKyAsIEqFISwgLSBLhSEtIC4gTIUhLiAvIE2FIS8gMCBOhSEwIDEgT4UhMSAyIFCFITIgMyBRhSEzIDQgUoUhNCA/IEmFIT8gPyBJhSE/IEAgSoUhQCBBIEuFIUEgQiBMhSFCIEMgTYUhQyBEIE6FIUQgRSBPhSFFIEYgUIUhRiBHIFGFIUcgSCBShSFIIAshCiA1ID99IUkgNiBAfSFKIDcgQX0hSyA4IEJ9IUwgOSBDfSFNIDogRH0hTiA7IEV9IU8gPCBGfSFQID0gR30hUSA+IEh9IVIgISArfSFTICIgLH0hVCAjIC19IVUgJCAufSFWICUgL30hVyAmIDB9IVggJyAxfSFZICggMn0hWiApIDN9IVsgKiA0fSFcICEgK3whISAiICx8ISIgIyAtfCEjICQgLnwhJCAlIC98ISUgJiAwfCEmICcgMXwhJyAoIDJ8ISggKSAzfCEpICogNHwhKiA1ID98ISsgNiBAfCEsIDcgQXwhLSA4IEJ8IS4gOSBDfCEvIDogRHwhMCA7IEV8ITEgPCBGfCEyID0gR3whMyA+IEh8ITQgISAiICMgJCAlICYgJyAoICkgKiBJIEogSyBMIE0gTiBPIFAgUSBSIA1BAREAACBTIFQgVSBWIFcgWCBZIFogWyBcICsgLCAtIC4gLyAwIDEgMiAzIDQgDkEBEQAAIFMgVCBVIFYgVyBYIFkgWiBbIFwgD0EAQQBBAhEBACAhICIgIyAkICUgJiAnICggKSAqIBBBAEEAQQIRAQAgDTUCACE/IA01AgQhQCANNQIIIUEgDTUCDCFCIA01AhAhQyANNQIUIUQgDTUCGCFFIA01AhwhRiANNQIgIUcgDTUCJCFIIA41AgAhKyAONQIEISwgDjUCCCEtIA41AgwhLiAONQIQIS8gDjUCFCEwIA41AhghMSAONQIcITIgDjUCICEzIA41AiQhNCAPNQIAIUkgDzUCBCFKIA81AgghSyAPNQIMIUwgDzUCECFNIA81AhQhTiAPNQIYIU8gDzUCHCFQIA81AiAhUSAPNQIkIVIgEDUCACFTIBA1AgQhVCAQNQIIIVUgEDUCDCFWIBA1AhAhVyAQNQIUIVggEDUCGCFZIBA1AhwhWiAQNQIgIVsgEDUCJCFcID8gK3whNSBAICx8ITYgQSAtfCE3IEIgLnwhOCBDIC98ITkgRCAwfCE6IEUgMXwhOyBGIDJ8ITwgRyAzfCE9IEggNHwhPiA/ICt9ISsgQCAsfSEsIEEgLX0hLSBCIC59IS4gQyAvfSEvIEQgMH0hMCBFIDF9ITEgRiAyfSEyIEcgM30hMyBIIDR9ITQgUyBUIFUgViBXIFggWSBaIFsgXCBJIEogSyBMIE0gTiBPIFAgUSBSIA5BAREAACBTIEl9IVMgVCBKfSFUIFUgS30hVSBWIEx9IVYgVyBNfSFXIFggTn0hWCBZIE99IVkgWiBQfSFaIFsgUX0hWyBcIFJ9IVwgKyAsIC0gLiAvIDAgMSAyIDMgNCANQQBBAEECEQEAQsK2B0IAQgBCAEIAQgBCAEIAQgBCACBTIFQgVSBWIFcgWCBZIFogWyBcIA5BAREAACA1IDYgNyA4IDkgOiA7IDwgPSA+IA9BAEEAQQIRAQAgDTUCACErIA01AgQhLCANNQIIIS0gDTUCDCEuIA01AhAhLyANNQIUITAgDTUCGCExIA01AhwhMiANNQIgITMgDTUCJCE0IA41AgAhPyAONQIEIUAgDjUCCCFBIA41AgwhQiAONQIQIUMgDjUCFCFEIA41AhghRSAONQIcIUYgDjUCICFHIA41AiQhSCAPNQIAITUgDzUCBCE2IA81AgghNyAPNQIMITggDzUCECE5IA81AhQhOiAPNQIYITsgDzUCHCE8IA81AiAhPSAPNQIkIT4gSSA/fCFJIEogQHwhSiBLIEF8IUsgTCBCfCFMIE0gQ3whTSBOIER8IU4gTyBFfCFPIFAgRnwhUCBRIEd8IVEgUiBIfCFSIBcgGCAZIBogGyAcIB0gHiAfICAgKyAsIC0gLiAvIDAgMSAyIDMgNCAOQQERAAAgSSBKIEsgTCBNIE4gTyBQIFEgUiBTIFQgVSBWIFcgWCBZIFogWyBcIA1BAREAACANNQIAISsgDTUCBCEsIA01AgghLSANNQIMIS4gDTUCECEvIA01AhQhMCANNQIYITEgDTUCHCEyIA01AiAhMyANNQIkITQgDjUCACE/IA41AgQhQCAONQIIIUEgDjUCDCFCIA41AhAhQyAONQIUIUQgDjUCGCFFIA41AhwhRiAONQIgIUcgDjUCJCFIIAxBAWshDAwACwsgBiAhPgIAIAYgIj4CBCAGICM+AgggBiAkPgIMIAYgJT4CECAGICY+AhQgBiAnPgIYIAYgKD4CHCAGICk+AiAgBiAqPgIkIAcgNT4CACAHIDY+AgQgByA3PgIIIAcgOD4CDCAHIDk+AhAgByA6PgIUIAcgOz4CGCAHIDw+AhwgByA9PgIgIAcgPj4CJCAIICs+AgAgCCAsPgIEIAggLT4CCCAIIC4+AgwgCCAvPgIQIAggMD4CFCAIIDE+AhggCCAyPgIcIAggMz4CICAIIDQ+AiQgCSA/PgIAIAkgQD4CBCAJIEE+AgggCSBCPgIMIAkgQz4CECAJIEQ+AhQgCSBFPgIYIAkgRj4CHCAJIEc+AiAgCSBIPgIkIAoL') + var wasm = toUint8Array('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') var ready = null var mod = { diff --git a/fe25519_25/scalarmult_curve25519.wat b/fe25519_25/scalarmult_curve25519.wat index ee17683..1ec4af3 100644 --- a/fe25519_25/scalarmult_curve25519.wat +++ b/fe25519_25/scalarmult_curve25519.wat @@ -1,5 +1,7 @@ (module (import "js" "table" (table 3 anyfunc)) + (import "js" "mem" (memory 1)) + (type $fe_mul (func (param $f_0 i64) (param $f_1 i64) @@ -38,6 +40,19 @@ (param $repeat i32) (param $res i32))) + (type $fe_invert (func + (param $f_0 i64) + (param $f_1 i64) + (param $f_2 i64) + (param $f_3 i64) + (param $f_4 i64) + (param $f_5 i64) + (param $f_6 i64) + (param $f_7 i64) + (param $f_8 i64) + (param $f_9 i64) + (param $res i32))) + (func $i32.log (import "debug" "log") (param i32)) (func $i32.log_tee (import "debug" "log_tee") (param i32) (result i32)) ;; No i64 interop with JS yet - but maybe coming with WebAssembly BigInt @@ -66,24 +81,14 @@ (call $i64.log (get_local $0)) (return (get_local $0))) - (memory $0 1) - (export "memory" (memory $0)) + ;; (memory $0 1) + ;; (export "memory" (memory $0)) (func $scalarmult (export "scalarmult") - (param $ptr_x1 i32) - (param $ptr_x2 i32) - (param $ptr_x3 i32) - (param $ptr_z2 i32) - (param $ptr_z3 i32) - - (param $ptr_t i32) - (param $res_x2 i32) - (param $res_x3 i32) - (param $res_z2 i32) - (param $res_z3 i32) - (result i32) + (param $ptr_x1 i32) + (param $ptr_t i32) (local $swap i32) (local $b i32) @@ -179,6 +184,15 @@ (local $tmp1_8 i64) (local $tmp1_9 i64) + (i32.const 400) + (set_local $ptr0) + (i32.const 440) + (set_local $ptr1) + (i32.const 480) + (set_local $ptr2) + (i32.const 520) + (set_local $ptr3) + (set_local $t_0 (i64.load offset=0 (get_local $ptr_t))) (set_local $t_1 (i64.load offset=8 (get_local $ptr_t))) (set_local $t_2 (i64.load offset=16 (get_local $ptr_t))) @@ -195,49 +209,49 @@ (set_local $x1_8 (i64.load32_u offset=32 (get_local $ptr_x1))) (set_local $x1_9 (i64.load32_u offset=36 (get_local $ptr_x1))) - (set_local $x2_0 (i64.load32_u offset=0 (get_local $ptr_x2))) - (set_local $x2_1 (i64.load32_u offset=4 (get_local $ptr_x2))) - (set_local $x2_2 (i64.load32_u offset=8 (get_local $ptr_x2))) - (set_local $x2_3 (i64.load32_u offset=12 (get_local $ptr_x2))) - (set_local $x2_4 (i64.load32_u offset=16 (get_local $ptr_x2))) - (set_local $x2_5 (i64.load32_u offset=20 (get_local $ptr_x2))) - (set_local $x2_6 (i64.load32_u offset=24 (get_local $ptr_x2))) - (set_local $x2_7 (i64.load32_u offset=28 (get_local $ptr_x2))) - (set_local $x2_8 (i64.load32_u offset=32 (get_local $ptr_x2))) - (set_local $x2_9 (i64.load32_u offset=36 (get_local $ptr_x2))) + (set_local $x2_0 (i64.const 1)) + (set_local $x2_1 (i64.const 0)) + (set_local $x2_2 (i64.const 0)) + (set_local $x2_3 (i64.const 0)) + (set_local $x2_4 (i64.const 0)) + (set_local $x2_5 (i64.const 0)) + (set_local $x2_6 (i64.const 0)) + (set_local $x2_7 (i64.const 0)) + (set_local $x2_8 (i64.const 0)) + (set_local $x2_9 (i64.const 0)) - (set_local $x3_0 (i64.load32_u offset=0 (get_local $ptr_x3))) - (set_local $x3_1 (i64.load32_u offset=4 (get_local $ptr_x3))) - (set_local $x3_2 (i64.load32_u offset=8 (get_local $ptr_x3))) - (set_local $x3_3 (i64.load32_u offset=12 (get_local $ptr_x3))) - (set_local $x3_4 (i64.load32_u offset=16 (get_local $ptr_x3))) - (set_local $x3_5 (i64.load32_u offset=20 (get_local $ptr_x3))) - (set_local $x3_6 (i64.load32_u offset=24 (get_local $ptr_x3))) - (set_local $x3_7 (i64.load32_u offset=28 (get_local $ptr_x3))) - (set_local $x3_8 (i64.load32_u offset=32 (get_local $ptr_x3))) - (set_local $x3_9 (i64.load32_u offset=36 (get_local $ptr_x3))) + (set_local $x3_0 (i64.load32_u offset=0 (get_local $ptr_x1))) + (set_local $x3_1 (i64.load32_u offset=4 (get_local $ptr_x1))) + (set_local $x3_2 (i64.load32_u offset=8 (get_local $ptr_x1))) + (set_local $x3_3 (i64.load32_u offset=12 (get_local $ptr_x1))) + (set_local $x3_4 (i64.load32_u offset=16 (get_local $ptr_x1))) + (set_local $x3_5 (i64.load32_u offset=20 (get_local $ptr_x1))) + (set_local $x3_6 (i64.load32_u offset=24 (get_local $ptr_x1))) + (set_local $x3_7 (i64.load32_u offset=28 (get_local $ptr_x1))) + (set_local $x3_8 (i64.load32_u offset=32 (get_local $ptr_x1))) + (set_local $x3_9 (i64.load32_u offset=36 (get_local $ptr_x1))) - (set_local $z2_0 (i64.load32_u offset=0 (get_local $ptr_z2))) - (set_local $z2_1 (i64.load32_u offset=4 (get_local $ptr_z2))) - (set_local $z2_2 (i64.load32_u offset=8 (get_local $ptr_z2))) - (set_local $z2_3 (i64.load32_u offset=12 (get_local $ptr_z2))) - (set_local $z2_4 (i64.load32_u offset=16 (get_local $ptr_z2))) - (set_local $z2_5 (i64.load32_u offset=20 (get_local $ptr_z2))) - (set_local $z2_6 (i64.load32_u offset=24 (get_local $ptr_z2))) - (set_local $z2_7 (i64.load32_u offset=28 (get_local $ptr_z2))) - (set_local $z2_8 (i64.load32_u offset=32 (get_local $ptr_z2))) - (set_local $z2_9 (i64.load32_u offset=36 (get_local $ptr_z2))) + (set_local $z2_0 (i64.const 0)) + (set_local $z2_1 (i64.const 0)) + (set_local $z2_2 (i64.const 0)) + (set_local $z2_3 (i64.const 0)) + (set_local $z2_4 (i64.const 0)) + (set_local $z2_5 (i64.const 0)) + (set_local $z2_6 (i64.const 0)) + (set_local $z2_7 (i64.const 0)) + (set_local $z2_8 (i64.const 0)) + (set_local $z2_9 (i64.const 0)) - (set_local $z3_0 (i64.load32_u offset=0 (get_local $ptr_z3))) - (set_local $z3_1 (i64.load32_u offset=4 (get_local $ptr_z3))) - (set_local $z3_2 (i64.load32_u offset=8 (get_local $ptr_z3))) - (set_local $z3_3 (i64.load32_u offset=12 (get_local $ptr_z3))) - (set_local $z3_4 (i64.load32_u offset=16 (get_local $ptr_z3))) - (set_local $z3_5 (i64.load32_u offset=20 (get_local $ptr_z3))) - (set_local $z3_6 (i64.load32_u offset=24 (get_local $ptr_z3))) - (set_local $z3_7 (i64.load32_u offset=28 (get_local $ptr_z3))) - (set_local $z3_8 (i64.load32_u offset=32 (get_local $ptr_z3))) - (set_local $z3_9 (i64.load32_u offset=36 (get_local $ptr_z3))) + (set_local $z3_0 (i64.const 1)) + (set_local $z3_1 (i64.const 0)) + (set_local $z3_2 (i64.const 0)) + (set_local $z3_3 (i64.const 0)) + (set_local $z3_4 (i64.const 0)) + (set_local $z3_5 (i64.const 0)) + (set_local $z3_6 (i64.const 0)) + (set_local $z3_7 (i64.const 0)) + (set_local $z3_8 (i64.const 0)) + (set_local $z3_9 (i64.const 0)) (i32.const 254) (set_local $pos) @@ -259,31 +273,32 @@ (get_local $pos) (i32.const 64) (i32.div_u) - (br_table $3 $2 $1 $0)) + (br_table $0 $1 $2 $3))) (get_local $t_3) (set_local $t) (br $break)) - (get_local $t_3) + (get_local $t_2) (set_local $t) (br $break)) - (get_local $t_3) + (get_local $t_1) (set_local $t) (br $break)) - (get_local $t_3) - (set_local $t) - (br $break))) + (get_local $t_0) + (set_local $t)) ;; end of switch statement (get_local $t) (get_local $pos) (i32.const 8) (i32.div_u) - (i32.const 64) + (i32.const 8) (i32.rem_u) + (i32.const 8) + (i32.mul) (i64.extend_u/i32) (i64.shr_u) (i64.const 0xff) @@ -380,11 +395,6 @@ (set_local $tmp0_9) - (get_local $x2_0) - (get_local $tmp0_0) - (i64.xor) - (set_local $x2_0) - (get_local $x2_0) (get_local $tmp0_0) (i64.xor) @@ -436,11 +446,6 @@ (set_local $x2_9) - (get_local $x3_0) - (get_local $tmp0_0) - (i64.xor) - (set_local $x3_0) - (get_local $x3_0) (get_local $tmp0_0) (i64.xor) @@ -563,11 +568,6 @@ (set_local $tmp0_9) - (get_local $z2_0) - (get_local $tmp0_0) - (i64.xor) - (set_local $z2_0) - (get_local $z2_0) (get_local $tmp0_0) (i64.xor) @@ -619,11 +619,6 @@ (set_local $z2_9) - (get_local $z3_0) - (get_local $tmp0_0) - (i64.xor) - (set_local $z3_0) - (get_local $z3_0) (get_local $tmp0_0) (i64.xor) @@ -942,9 +937,9 @@ (get_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp1_9) + (i32.const 0) + (i32.const 0) (get_local $ptr2) - (i32.const 0) - (i32.const 0) (i32.const 2) (call_indirect (type $fe_sq)) @@ -959,9 +954,9 @@ (get_local $x2_7) (get_local $x2_8) (get_local $x2_9) + (i32.const 0) + (i32.const 0) (get_local $ptr3) - (i32.const 0) - (i32.const 0) (i32.const 2) (call_indirect (type $fe_sq)) @@ -1136,7 +1131,7 @@ (get_local $tmp0_7) (get_local $tmp0_8) (get_local $tmp0_9) - (get_local $ptr1) + (get_local $ptr0) (i32.const 1) (call_indirect (type $fe_mul)) @@ -1202,9 +1197,9 @@ (get_local $z2_7) (get_local $z2_8) (get_local $z2_9) - (get_local $ptr0) (i32.const 0) (i32.const 0) + (get_local $ptr1) (i32.const 2) (call_indirect (type $fe_sq)) @@ -1229,7 +1224,7 @@ (get_local $tmp1_7) (get_local $tmp1_8) (get_local $tmp1_9) - (get_local $ptr1) + (get_local $ptr2) (i32.const 1) (call_indirect (type $fe_mul)) @@ -1244,47 +1239,59 @@ (get_local $x3_7) (get_local $x3_8) (get_local $x3_9) - (get_local $ptr2) (i32.const 0) (i32.const 0) + (get_local $ptr3) (i32.const 2) (call_indirect (type $fe_sq)) - ;; tmp0 <- load(ptr2) - (set_local $z2_0 (i64.load32_u offset=0 (get_local $ptr0))) - (set_local $z2_1 (i64.load32_u offset=4 (get_local $ptr0))) - (set_local $z2_2 (i64.load32_u offset=8 (get_local $ptr0))) - (set_local $z2_3 (i64.load32_u offset=12 (get_local $ptr0))) - (set_local $z2_4 (i64.load32_u offset=16 (get_local $ptr0))) - (set_local $z2_5 (i64.load32_u offset=20 (get_local $ptr0))) - (set_local $z2_6 (i64.load32_u offset=24 (get_local $ptr0))) - (set_local $z2_7 (i64.load32_u offset=28 (get_local $ptr0))) - (set_local $z2_8 (i64.load32_u offset=32 (get_local $ptr0))) - (set_local $z2_9 (i64.load32_u offset=36 (get_local $ptr0))) + ;; x2 <- load(ptr0) + (set_local $x2_0 (i64.load32_u offset=0 (get_local $ptr0))) + (set_local $x2_1 (i64.load32_u offset=4 (get_local $ptr0))) + (set_local $x2_2 (i64.load32_u offset=8 (get_local $ptr0))) + (set_local $x2_3 (i64.load32_u offset=12 (get_local $ptr0))) + (set_local $x2_4 (i64.load32_u offset=16 (get_local $ptr0))) + (set_local $x2_5 (i64.load32_u offset=20 (get_local $ptr0))) + (set_local $x2_6 (i64.load32_u offset=24 (get_local $ptr0))) + (set_local $x2_7 (i64.load32_u offset=28 (get_local $ptr0))) + (set_local $x2_8 (i64.load32_u offset=32 (get_local $ptr0))) + (set_local $x2_9 (i64.load32_u offset=36 (get_local $ptr0))) - ;; tmp0 <- load(ptr2) - (set_local $z3_0 (i64.load32_u offset=0 (get_local $ptr1))) - (set_local $z3_1 (i64.load32_u offset=4 (get_local $ptr1))) - (set_local $z3_2 (i64.load32_u offset=8 (get_local $ptr1))) - (set_local $z3_3 (i64.load32_u offset=12 (get_local $ptr1))) - (set_local $z3_4 (i64.load32_u offset=16 (get_local $ptr1))) - (set_local $z3_5 (i64.load32_u offset=20 (get_local $ptr1))) - (set_local $z3_6 (i64.load32_u offset=24 (get_local $ptr1))) - (set_local $z3_7 (i64.load32_u offset=28 (get_local $ptr1))) - (set_local $z3_8 (i64.load32_u offset=32 (get_local $ptr1))) - (set_local $z3_9 (i64.load32_u offset=36 (get_local $ptr1))) + ;; z2 <- load(ptr1) + (set_local $z2_0 (i64.load32_u offset=0 (get_local $ptr1))) + (set_local $z2_1 (i64.load32_u offset=4 (get_local $ptr1))) + (set_local $z2_2 (i64.load32_u offset=8 (get_local $ptr1))) + (set_local $z2_3 (i64.load32_u offset=12 (get_local $ptr1))) + (set_local $z2_4 (i64.load32_u offset=16 (get_local $ptr1))) + (set_local $z2_5 (i64.load32_u offset=20 (get_local $ptr1))) + (set_local $z2_6 (i64.load32_u offset=24 (get_local $ptr1))) + (set_local $z2_7 (i64.load32_u offset=28 (get_local $ptr1))) + (set_local $z2_8 (i64.load32_u offset=32 (get_local $ptr1))) + (set_local $z2_9 (i64.load32_u offset=36 (get_local $ptr1))) - ;; tmp0 <- load(ptr2) - (set_local $x3_0 (i64.load32_u offset=0 (get_local $ptr2))) - (set_local $x3_1 (i64.load32_u offset=4 (get_local $ptr2))) - (set_local $x3_2 (i64.load32_u offset=8 (get_local $ptr2))) - (set_local $x3_3 (i64.load32_u offset=12 (get_local $ptr2))) - (set_local $x3_4 (i64.load32_u offset=16 (get_local $ptr2))) - (set_local $x3_5 (i64.load32_u offset=20 (get_local $ptr2))) - (set_local $x3_6 (i64.load32_u offset=24 (get_local $ptr2))) - (set_local $x3_7 (i64.load32_u offset=28 (get_local $ptr2))) - (set_local $x3_8 (i64.load32_u offset=32 (get_local $ptr2))) - (set_local $x3_9 (i64.load32_u offset=36 (get_local $ptr2))) + ;; z3 <- load(ptr2) + (set_local $z3_0 (i64.load32_u offset=0 (get_local $ptr2))) + (set_local $z3_1 (i64.load32_u offset=4 (get_local $ptr2))) + (set_local $z3_2 (i64.load32_u offset=8 (get_local $ptr2))) + (set_local $z3_3 (i64.load32_u offset=12 (get_local $ptr2))) + (set_local $z3_4 (i64.load32_u offset=16 (get_local $ptr2))) + (set_local $z3_5 (i64.load32_u offset=20 (get_local $ptr2))) + (set_local $z3_6 (i64.load32_u offset=24 (get_local $ptr2))) + (set_local $z3_7 (i64.load32_u offset=28 (get_local $ptr2))) + (set_local $z3_8 (i64.load32_u offset=32 (get_local $ptr2))) + (set_local $z3_9 (i64.load32_u offset=36 (get_local $ptr2))) + + ;; x3 <- load(ptr3) + (set_local $x3_0 (i64.load32_u offset=0 (get_local $ptr3))) + (set_local $x3_1 (i64.load32_u offset=4 (get_local $ptr3))) + (set_local $x3_2 (i64.load32_u offset=8 (get_local $ptr3))) + (set_local $x3_3 (i64.load32_u offset=12 (get_local $ptr3))) + (set_local $x3_4 (i64.load32_u offset=16 (get_local $ptr3))) + (set_local $x3_5 (i64.load32_u offset=20 (get_local $ptr3))) + (set_local $x3_6 (i64.load32_u offset=24 (get_local $ptr3))) + (set_local $x3_7 (i64.load32_u offset=28 (get_local $ptr3))) + (set_local $x3_8 (i64.load32_u offset=32 (get_local $ptr3))) + (set_local $x3_9 (i64.load32_u offset=36 (get_local $ptr3))) (get_local $tmp0_0) (get_local $z3_0) @@ -1416,50 +1423,393 @@ (set_local $pos) (br $start))) - ;; (call $i32.log (get_local $res_x2)) + ;; (call $i32.log (get_local $res_x2)) + (i32.const 0) + (get_local $swap) + (i32.sub) + (i64.extend_u/i32) + (set_local $mask) - (i64.store32 offset=0 (get_local $res_x2) (get_local $x2_0)) - (i64.store32 offset=4 (get_local $res_x2) (get_local $x2_1)) - (i64.store32 offset=8 (get_local $res_x2) (get_local $x2_2)) - (i64.store32 offset=12 (get_local $res_x2) (get_local $x2_3)) - (i64.store32 offset=16 (get_local $res_x2) (get_local $x2_4)) - (i64.store32 offset=20 (get_local $res_x2) (get_local $x2_5)) - (i64.store32 offset=24 (get_local $res_x2) (get_local $x2_6)) - (i64.store32 offset=28 (get_local $res_x2) (get_local $x2_7)) - (i64.store32 offset=32 (get_local $res_x2) (get_local $x2_8)) - (i64.store32 offset=36 (get_local $res_x2) (get_local $x2_9)) + (get_local $x2_0) + (get_local $x3_0) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_0) - (i64.store32 offset=0 (get_local $res_x3) (get_local $x3_0)) - (i64.store32 offset=4 (get_local $res_x3) (get_local $x3_1)) - (i64.store32 offset=8 (get_local $res_x3) (get_local $x3_2)) - (i64.store32 offset=12 (get_local $res_x3) (get_local $x3_3)) - (i64.store32 offset=16 (get_local $res_x3) (get_local $x3_4)) - (i64.store32 offset=20 (get_local $res_x3) (get_local $x3_5)) - (i64.store32 offset=24 (get_local $res_x3) (get_local $x3_6)) - (i64.store32 offset=28 (get_local $res_x3) (get_local $x3_7)) - (i64.store32 offset=32 (get_local $res_x3) (get_local $x3_8)) - (i64.store32 offset=36 (get_local $res_x3) (get_local $x3_9)) + (get_local $x2_1) + (get_local $x3_1) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_1) - (i64.store32 offset=0 (get_local $res_z2) (get_local $z2_0)) - (i64.store32 offset=4 (get_local $res_z2) (get_local $z2_1)) - (i64.store32 offset=8 (get_local $res_z2) (get_local $z2_2)) - (i64.store32 offset=12 (get_local $res_z2) (get_local $z2_3)) - (i64.store32 offset=16 (get_local $res_z2) (get_local $z2_4)) - (i64.store32 offset=20 (get_local $res_z2) (get_local $z2_5)) - (i64.store32 offset=24 (get_local $res_z2) (get_local $z2_6)) - (i64.store32 offset=28 (get_local $res_z2) (get_local $z2_7)) - (i64.store32 offset=32 (get_local $res_z2) (get_local $z2_8)) - (i64.store32 offset=36 (get_local $res_z2) (get_local $z2_9)) + (get_local $x2_2) + (get_local $x3_2) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_2) - (i64.store32 offset=0 (get_local $res_z3) (get_local $z3_0)) - (i64.store32 offset=4 (get_local $res_z3) (get_local $z3_1)) - (i64.store32 offset=8 (get_local $res_z3) (get_local $z3_2)) - (i64.store32 offset=12 (get_local $res_z3) (get_local $z3_3)) - (i64.store32 offset=16 (get_local $res_z3) (get_local $z3_4)) - (i64.store32 offset=20 (get_local $res_z3) (get_local $z3_5)) - (i64.store32 offset=24 (get_local $res_z3) (get_local $z3_6)) - (i64.store32 offset=28 (get_local $res_z3) (get_local $z3_7)) - (i64.store32 offset=32 (get_local $res_z3) (get_local $z3_8)) - (i64.store32 offset=36 (get_local $res_z3) (get_local $z3_9)) + (get_local $x2_3) + (get_local $x3_3) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_3) - (get_local $swap))) + (get_local $x2_4) + (get_local $x3_4) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_4) + + (get_local $x2_5) + (get_local $x3_5) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_5) + + (get_local $x2_6) + (get_local $x3_6) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_6) + + (get_local $x2_7) + (get_local $x3_7) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_7) + + (get_local $x2_8) + (get_local $x3_8) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_8) + + (get_local $x2_9) + (get_local $x3_9) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_9) + + + (get_local $x2_0) + (get_local $tmp0_0) + (i64.xor) + (set_local $x2_0) + + (get_local $x2_1) + (get_local $tmp0_1) + (i64.xor) + (set_local $x2_1) + + (get_local $x2_2) + (get_local $tmp0_2) + (i64.xor) + (set_local $x2_2) + + (get_local $x2_3) + (get_local $tmp0_3) + (i64.xor) + (set_local $x2_3) + + (get_local $x2_4) + (get_local $tmp0_4) + (i64.xor) + (set_local $x2_4) + + (get_local $x2_5) + (get_local $tmp0_5) + (i64.xor) + (set_local $x2_5) + + (get_local $x2_6) + (get_local $tmp0_6) + (i64.xor) + (set_local $x2_6) + + (get_local $x2_7) + (get_local $tmp0_7) + (i64.xor) + (set_local $x2_7) + + (get_local $x2_8) + (get_local $tmp0_8) + (i64.xor) + (set_local $x2_8) + + (get_local $x2_9) + (get_local $tmp0_9) + (i64.xor) + (set_local $x2_9) + + + (get_local $x3_0) + (get_local $tmp0_0) + (i64.xor) + (set_local $x3_0) + + (get_local $x3_1) + (get_local $tmp0_1) + (i64.xor) + (set_local $x3_1) + + (get_local $x3_2) + (get_local $tmp0_2) + (i64.xor) + (set_local $x3_2) + + (get_local $x3_3) + (get_local $tmp0_3) + (i64.xor) + (set_local $x3_3) + + (get_local $x3_4) + (get_local $tmp0_4) + (i64.xor) + (set_local $x3_4) + + (get_local $x3_5) + (get_local $tmp0_5) + (i64.xor) + (set_local $x3_5) + + (get_local $x3_6) + (get_local $tmp0_6) + (i64.xor) + (set_local $x3_6) + + (get_local $x3_7) + (get_local $tmp0_7) + (i64.xor) + (set_local $x3_7) + + (get_local $x3_8) + (get_local $tmp0_8) + (i64.xor) + (set_local $x3_8) + + (get_local $x3_9) + (get_local $tmp0_9) + (i64.xor) + (set_local $x3_9) + + + (get_local $z2_0) + (get_local $z3_0) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_0) + + (get_local $z2_1) + (get_local $z3_1) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_1) + + (get_local $z2_2) + (get_local $z3_2) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_2) + + (get_local $z2_3) + (get_local $z3_3) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_3) + + (get_local $z2_4) + (get_local $z3_4) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_4) + + (get_local $z2_5) + (get_local $z3_5) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_5) + + (get_local $z2_6) + (get_local $z3_6) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_6) + + (get_local $z2_7) + (get_local $z3_7) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_7) + + (get_local $z2_8) + (get_local $z3_8) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_8) + + (get_local $z2_9) + (get_local $z3_9) + (i64.xor) + (get_local $mask) + (i64.and) + (set_local $tmp0_9) + + + (get_local $z2_0) + (get_local $tmp0_0) + (i64.xor) + (set_local $z2_0) + + (get_local $z2_1) + (get_local $tmp0_1) + (i64.xor) + (set_local $z2_1) + + (get_local $z2_2) + (get_local $tmp0_2) + (i64.xor) + (set_local $z2_2) + + (get_local $z2_3) + (get_local $tmp0_3) + (i64.xor) + (set_local $z2_3) + + (get_local $z2_4) + (get_local $tmp0_4) + (i64.xor) + (set_local $z2_4) + + (get_local $z2_5) + (get_local $tmp0_5) + (i64.xor) + (set_local $z2_5) + + (get_local $z2_6) + (get_local $tmp0_6) + (i64.xor) + (set_local $z2_6) + + (get_local $z2_7) + (get_local $tmp0_7) + (i64.xor) + (set_local $z2_7) + + (get_local $z2_8) + (get_local $tmp0_8) + (i64.xor) + (set_local $z2_8) + + (get_local $z2_9) + (get_local $tmp0_9) + (i64.xor) + (set_local $z2_9) + + + (get_local $z3_0) + (get_local $tmp0_0) + (i64.xor) + (set_local $z3_0) + + (get_local $z3_1) + (get_local $tmp0_1) + (i64.xor) + (set_local $z3_1) + + (get_local $z3_2) + (get_local $tmp0_2) + (i64.xor) + (set_local $z3_2) + + (get_local $z3_3) + (get_local $tmp0_3) + (i64.xor) + (set_local $z3_3) + + (get_local $z3_4) + (get_local $tmp0_4) + (i64.xor) + (set_local $z3_4) + + (get_local $z3_5) + (get_local $tmp0_5) + (i64.xor) + (set_local $z3_5) + + (get_local $z3_6) + (get_local $tmp0_6) + (i64.xor) + (set_local $z3_6) + + (get_local $z3_7) + (get_local $tmp0_7) + (i64.xor) + (set_local $z3_7) + + (get_local $z3_8) + (get_local $tmp0_8) + (i64.xor) + (set_local $z3_8) + + (get_local $z3_9) + (get_local $tmp0_9) + (i64.xor) + (set_local $z3_9) + + + (get_local $z2_0) + (get_local $z2_1) + (get_local $z2_2) + (get_local $z2_3) + (get_local $z2_4) + (get_local $z2_5) + (get_local $z2_6) + (get_local $z2_7) + (get_local $z2_8) + (get_local $z2_9) + (get_local $ptr0) + (i32.const 3) + (call_indirect (type $fe_invert)) + + (i64.load32_u offset=0 (get_local $ptr0)) + (i64.load32_u offset=4 (get_local $ptr0)) + (i64.load32_u offset=8 (get_local $ptr0)) + (i64.load32_u offset=12 (get_local $ptr0)) + (i64.load32_u offset=16 (get_local $ptr0)) + (i64.load32_u offset=20 (get_local $ptr0)) + (i64.load32_u offset=24 (get_local $ptr0)) + (i64.load32_u offset=28 (get_local $ptr0)) + (i64.load32_u offset=32 (get_local $ptr0)) + (i64.load32_u offset=36 (get_local $ptr0)) + (get_local $x2_0) + (get_local $x2_1) + (get_local $x2_2) + (get_local $x2_3) + (get_local $x2_4) + (get_local $x2_5) + (get_local $x2_6) + (get_local $x2_7) + (get_local $x2_8) + (get_local $x2_9) + (get_local $res_x2) + (i32.const 1) + (call_indirect (type $fe_mul))))