UNPKG

wasmcurves

Version:

elliptic curves implementations in wasm

81 lines (70 loc) 2.65 kB
module.exports = buildBatchConvertion; function buildBatchConvertion(module, fnName, internalFnName, sizeIn, sizeOut, reverse) { if (typeof reverse === "undefined") { // Set the reverse in a way that allows to use the same buffer as in/out. if (sizeIn < sizeOut) { reverse = true; } else { reverse = false; } } const f = module.addFunction(fnName); f.addParam("pIn", "i32"); f.addParam("n", "i32"); f.addParam("pOut", "i32"); f.addLocal("i", "i32"); f.addLocal("itIn", "i32"); f.addLocal("itOut", "i32"); const c = f.getCodeBuilder(); if (reverse) { f.addCode( c.setLocal("itIn", c.i32_add( c.getLocal("pIn"), c.i32_mul( c.i32_sub( c.getLocal("n"), c.i32_const(1) ), c.i32_const(sizeIn) ) ) ), c.setLocal("itOut", c.i32_add( c.getLocal("pOut"), c.i32_mul( c.i32_sub( c.getLocal("n"), c.i32_const(1) ), c.i32_const(sizeOut) ) ) ), c.setLocal("i", c.i32_const(0)), c.block(c.loop( c.br_if(1, c.i32_eq ( c.getLocal("i"), c.getLocal("n") )), c.call(internalFnName, c.getLocal("itIn"), c.getLocal("itOut")), c.setLocal("itIn", c.i32_sub(c.getLocal("itIn"), c.i32_const(sizeIn))), c.setLocal("itOut", c.i32_sub(c.getLocal("itOut"), c.i32_const(sizeOut))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0) )), ); } else { f.addCode( c.setLocal("itIn", c.getLocal("pIn")), c.setLocal("itOut", c.getLocal("pOut")), c.setLocal("i", c.i32_const(0)), c.block(c.loop( c.br_if(1, c.i32_eq ( c.getLocal("i"), c.getLocal("n") )), c.call(internalFnName, c.getLocal("itIn"), c.getLocal("itOut")), c.setLocal("itIn", c.i32_add(c.getLocal("itIn"), c.i32_const(sizeIn))), c.setLocal("itOut", c.i32_add(c.getLocal("itOut"), c.i32_const(sizeOut))), c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), c.br(0) )), ); } }