scalarmult_curve25519 implemented in wasm

This commit is contained in:
Christophe Diederichs 2020-10-17 22:42:56 +02:00
parent bafe8f8fac
commit 88862d3669
11 changed files with 695 additions and 295 deletions

View File

@ -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)
}

View File

@ -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'))

View File

@ -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)
}
}

File diff suppressed because one or more lines are too long

View File

@ -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)))

View File

@ -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)
}

View File

@ -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))
@ -13,9 +15,6 @@
;; (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))
;; ;; i64 logging by splitting into two i32 limbs
;; (func $i64.log
;; (param $0 i64)

View File

@ -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 = {

View File

@ -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)
@ -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))

View File

@ -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 = {

View File

@ -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))))