From 6fd3f05f7a3d68b95819cd2f4611f93444dc6fe7 Mon Sep 17 00:00:00 2001 From: CanadaHonk Date: Mon, 22 Jan 2024 02:13:41 +0000 Subject: [PATCH] encoding/ieee754: rewrite using typedarray --- compiler/encoding.js | 118 +------------------------------------------ 1 file changed, 2 insertions(+), 116 deletions(-) diff --git a/compiler/encoding.js b/compiler/encoding.js index 4b7b273c..495e6f25 100644 --- a/compiler/encoding.js +++ b/compiler/encoding.js @@ -105,119 +105,5 @@ export const read_unsignedLEB128 = _input => { }; // ieee 754 binary64 - -// from https://github.com/feross/ieee754 -// BSD 3-Clause. Copyright 2008 Fair Oaks Labs, Inc. (https://github.com/feross/ieee754/blob/master/LICENSE) -export const ieee754_binary64 = value => { - return [...new Uint8Array(new Float64Array([ value ]).buffer)]; - - let isLE = true, mLen = 52, nBytes = 8, offset = 0; - let buffer = new Array(nBytes).fill(0); - - let e, m, c - let eLen = (nBytes * 8) - mLen - 1 - const eMax = (1 << eLen) - 1 - const eBias = eMax >> 1 - const rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - let i = isLE ? 0 : (nBytes - 1) - const d = isLE ? 1 : -1 - const s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = ((value * c) - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - while (mLen >= 8) { - buffer[offset + i] = m & 0xff - i += d - m /= 256 - mLen -= 8 - } - - e = (e << mLen) | m - eLen += mLen - while (eLen > 0) { - buffer[offset + i] = e & 0xff - i += d - e /= 256 - eLen -= 8 - } - - buffer[offset + i - d] |= s * 128 - - return buffer; -}; - -export const read_ieee754_binary64 = buffer => { - return new Float64Array(new Uint8Array(buffer).buffer)[0]; - - let isLE = true, mLen = 52, nBytes = 8, offset = 0; - - let e, m - const eLen = (nBytes * 8) - mLen - 1 - const eMax = (1 << eLen) - 1 - const eBias = eMax >> 1 - let nBits = -7 - let i = isLE ? (nBytes - 1) : 0 - const d = isLE ? -1 : 1 - let s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - while (nBits > 0) { - e = (e * 256) + buffer[offset + i] - i += d - nBits -= 8 - } - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - while (nBits > 0) { - m = (m * 256) + buffer[offset + i] - i += d - nBits -= 8 - } - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -}; \ No newline at end of file +export const ieee754_binary64 = value => [...new Uint8Array(new Float64Array([ value ]).buffer)]; +export const read_ieee754_binary64 = buffer => new Float64Array(new Uint8Array(buffer).buffer)[0]; \ No newline at end of file