simdle-native
Version:
libsimdle JavaScript bindings for Node.js
139 lines (110 loc) • 3.2 kB
JavaScript
const binding = require('./binding')
const b4a = require('b4a')
function unary (u8, u16, u32) {
return function unary (buf, result = b4a.allocUnsafe(buf.byteLength)) {
if (buf.byteLength % 16 !== 0) {
throw new Error('Buffer length must be a multiple of 16')
}
if (buf.byteLength !== result.byteLength) {
throw new Error('Length of result buffer is insufficient')
}
const n = buf.BYTES_PER_ELEMENT
if (n === 1) u8(buf, result)
else if (n === 2) u16(buf, result)
else u32(buf, result)
return result
}
}
function binary (u8, u16, u32) {
return function binary (a, b, result = b4a.allocUnsafe(a.byteLength)) {
if (a.byteLength % 16 !== 0) {
throw new Error('Buffer length must be a multiple of 16')
}
if (a.byteLength !== b.byteLength || a.byteLength !== result.byteLength) {
throw new Error('Buffers must be the same length')
}
const n = a.BYTES_PER_ELEMENT
if (n === 1) u8(a, b, result)
else if (n === 2) u16(a, b, result)
else u32(a, b, result)
return result
}
}
function reduce (u8, u16, u32) {
return function reduce (buf) {
if (buf.byteLength % 16 !== 0) {
throw new Error('Buffer length must be a multiple of 16')
}
const n = buf.BYTES_PER_ELEMENT
if (n === 1) return u8(buf)
if (n === 2) return u16(buf)
return u32(buf)
}
}
exports.allo = function allo (buf) {
if (buf.byteLength % 16 !== 0) {
throw new Error('Buffer length must be a multiple of 16')
}
return binding.simdle_napi_allo_v128(buf) !== 0
}
exports.allz = function allz (buf) {
if (buf.byteLength % 16 !== 0) {
throw new Error('Buffer length must be a multiple of 16')
}
return binding.simdle_napi_allz_v128(buf) !== 0
}
exports.and = binary(
binding.simdle_napi_and_v128_u8,
binding.simdle_napi_and_v128_u16,
binding.simdle_napi_and_v128_u32
)
exports.clear = binary(
binding.simdle_napi_clear_v128_u8,
binding.simdle_napi_clear_v128_u16,
binding.simdle_napi_clear_v128_u32
)
exports.clo = unary(
binding.simdle_napi_clo_v128_u8,
binding.simdle_napi_clo_v128_u16,
binding.simdle_napi_clo_v128_u32
)
exports.clz = unary(
binding.simdle_napi_clz_v128_u8,
binding.simdle_napi_clz_v128_u16,
binding.simdle_napi_clz_v128_u32
)
exports.cnt = unary(
binding.simdle_napi_cnt_v128_u8,
binding.simdle_napi_cnt_v128_u16,
binding.simdle_napi_cnt_v128_u32
)
exports.cto = unary(
binding.simdle_napi_cto_v128_u8,
binding.simdle_napi_cto_v128_u16,
binding.simdle_napi_cto_v128_u32
)
exports.ctz = unary(
binding.simdle_napi_ctz_v128_u8,
binding.simdle_napi_ctz_v128_u16,
binding.simdle_napi_ctz_v128_u32
)
exports.not = unary(
binding.simdle_napi_not_v128_u8,
binding.simdle_napi_not_v128_u16,
binding.simdle_napi_not_v128_u32
)
exports.or = binary(
binding.simdle_napi_or_v128_u8,
binding.simdle_napi_or_v128_u16,
binding.simdle_napi_or_v128_u32
)
exports.sum = reduce(
binding.simdle_napi_sum_v128_u8,
binding.simdle_napi_sum_v128_u16,
binding.simdle_napi_sum_v128_u32
)
exports.xor = binary(
binding.simdle_napi_xor_v128_u8,
binding.simdle_napi_xor_v128_u16,
binding.simdle_napi_xor_v128_u32
)