mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
JS: represent long as BigInt if available
This commit is contained in:
parent
1eab7e41b1
commit
ca23da939a
|
@ -312,8 +312,10 @@ class NameFrequencyEstimator extends RecursiveVisitor implements MethodNodeVisit
|
||||||
if (expr.getSource() == OperationType.LONG) {
|
if (expr.getSource() == OperationType.LONG) {
|
||||||
if (expr.getTarget() == OperationType.DOUBLE || expr.getTarget() == OperationType.FLOAT) {
|
if (expr.getTarget() == OperationType.DOUBLE || expr.getTarget() == OperationType.FLOAT) {
|
||||||
consumer.consumeFunction("Long_toNumber");
|
consumer.consumeFunction("Long_toNumber");
|
||||||
|
} else if (expr.getTarget() == OperationType.INT) {
|
||||||
|
consumer.consumeFunction("Long_lo");
|
||||||
}
|
}
|
||||||
} else {
|
} else if (expr.getTarget() == OperationType.LONG) {
|
||||||
switch (expr.getSource()) {
|
switch (expr.getSource()) {
|
||||||
case INT:
|
case INT:
|
||||||
consumer.consumeFunction("Long_fromInt");
|
consumer.consumeFunction("Long_fromInt");
|
||||||
|
@ -339,7 +341,7 @@ class NameFrequencyEstimator extends RecursiveVisitor implements MethodNodeVisit
|
||||||
} else if ((int) value == value) {
|
} else if ((int) value == value) {
|
||||||
consumer.consumeFunction("Long_fromInt");
|
consumer.consumeFunction("Long_fromInt");
|
||||||
} else {
|
} else {
|
||||||
consumer.consumeFunction("Long");
|
consumer.consumeFunction("Long_create");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -261,7 +261,8 @@ public class Renderer implements RenderingManager {
|
||||||
"$rt_createLongArrayFromData", "$rt_createBooleanArray", "$rt_createByteArray",
|
"$rt_createLongArrayFromData", "$rt_createBooleanArray", "$rt_createByteArray",
|
||||||
"$rt_createShortArray", "$rt_createCharArray", "$rt_createIntArray", "$rt_createLongArray",
|
"$rt_createShortArray", "$rt_createCharArray", "$rt_createIntArray", "$rt_createLongArray",
|
||||||
"$rt_createFloatArray", "$rt_createDoubleArray", "$rt_compare",
|
"$rt_createFloatArray", "$rt_createDoubleArray", "$rt_compare",
|
||||||
"Long_toNumber", "Long_fromInt", "Long_fromNumber", "Long", "Long_ZERO");
|
"Long_toNumber", "Long_fromInt", "Long_fromNumber", "Long_create", "Long_ZERO",
|
||||||
|
"Long_hi", "Long_lo");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderLongRuntimeAliases() throws IOException {
|
public void renderLongRuntimeAliases() throws IOException {
|
||||||
|
|
|
@ -239,7 +239,7 @@ public class RenderingContext {
|
||||||
} else if ((int) value == value) {
|
} else if ((int) value == value) {
|
||||||
writer.appendFunction("Long_fromInt").append("(").append(String.valueOf(value)).append(")");
|
writer.appendFunction("Long_fromInt").append("(").append(String.valueOf(value)).append(")");
|
||||||
} else {
|
} else {
|
||||||
writer.append("new ").appendFunction("Long").append("(" + (value & 0xFFFFFFFFL)
|
writer.appendFunction("Long_create").append("(" + (value & 0xFFFFFFFFL)
|
||||||
+ ", " + (value >>> 32) + ")");
|
+ ", " + (value >>> 32) + ")");
|
||||||
}
|
}
|
||||||
} else if (cst instanceof Character) {
|
} else if (cst instanceof Character) {
|
||||||
|
|
|
@ -929,11 +929,13 @@ public class StatementRenderer implements ExprVisitor, StatementVisitor {
|
||||||
precedence = Precedence.MEMBER_ACCESS;
|
precedence = Precedence.MEMBER_ACCESS;
|
||||||
Expr longShifted = extractLongRightShiftedBy32(expr.getValue());
|
Expr longShifted = extractLongRightShiftedBy32(expr.getValue());
|
||||||
if (longShifted != null) {
|
if (longShifted != null) {
|
||||||
|
writer.appendFunction("Long_hi").append("(");
|
||||||
longShifted.acceptVisitor(this);
|
longShifted.acceptVisitor(this);
|
||||||
writer.append(".hi");
|
writer.append(")");
|
||||||
} else {
|
} else {
|
||||||
|
writer.appendFunction("Long_lo").append("(");
|
||||||
expr.getValue().acceptVisitor(this);
|
expr.getValue().acceptVisitor(this);
|
||||||
writer.append(".lo");
|
writer.append(")");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FLOAT:
|
case FLOAT:
|
||||||
|
|
|
@ -14,13 +14,42 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
"use strict";
|
"use strict";
|
||||||
function Long_eq(a, b) {
|
|
||||||
|
var Long_eq;
|
||||||
|
var Long_ne;
|
||||||
|
var Long_gt;
|
||||||
|
var Long_ge;
|
||||||
|
var Long_lt;
|
||||||
|
var Long_le;
|
||||||
|
var Long_compare;
|
||||||
|
var Long_add;
|
||||||
|
var Long_sub;
|
||||||
|
var Long_inc;
|
||||||
|
var Long_dec;
|
||||||
|
var Long_mul;
|
||||||
|
var Long_div;
|
||||||
|
var Long_rem;
|
||||||
|
var Long_udiv;
|
||||||
|
var Long_urem;
|
||||||
|
var Long_neg;
|
||||||
|
var Long_and;
|
||||||
|
var Long_or;
|
||||||
|
var Long_xor;
|
||||||
|
var Long_shl;
|
||||||
|
var Long_shr;
|
||||||
|
var Long_shru;
|
||||||
|
var Long_not;
|
||||||
|
|
||||||
|
if (typeof BigInt !== 'function') {
|
||||||
|
Long_eq = function(a, b) {
|
||||||
return a.hi === b.hi && a.lo === b.lo;
|
return a.hi === b.hi && a.lo === b.lo;
|
||||||
}
|
}
|
||||||
function Long_ne(a, b) {
|
|
||||||
|
Long_ne = function(a, b) {
|
||||||
return a.hi !== b.hi || a.lo !== b.lo;
|
return a.hi !== b.hi || a.lo !== b.lo;
|
||||||
}
|
}
|
||||||
function Long_gt(a, b) {
|
|
||||||
|
Long_gt = function(a, b) {
|
||||||
if (a.hi < b.hi) {
|
if (a.hi < b.hi) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +63,8 @@ function Long_gt(a, b) {
|
||||||
}
|
}
|
||||||
return (a.lo & 1) > (b.lo & 1);
|
return (a.lo & 1) > (b.lo & 1);
|
||||||
}
|
}
|
||||||
function Long_ge(a, b) {
|
|
||||||
|
Long_ge = function(a, b) {
|
||||||
if (a.hi < b.hi) {
|
if (a.hi < b.hi) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -48,7 +78,8 @@ function Long_ge(a, b) {
|
||||||
}
|
}
|
||||||
return (a.lo & 1) >= (b.lo & 1);
|
return (a.lo & 1) >= (b.lo & 1);
|
||||||
}
|
}
|
||||||
function Long_lt(a, b) {
|
|
||||||
|
Long_lt = function(a, b) {
|
||||||
if (a.hi > b.hi) {
|
if (a.hi > b.hi) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -62,7 +93,8 @@ function Long_lt(a, b) {
|
||||||
}
|
}
|
||||||
return (a.lo & 1) < (b.lo & 1);
|
return (a.lo & 1) < (b.lo & 1);
|
||||||
}
|
}
|
||||||
function Long_le(a, b) {
|
|
||||||
|
Long_le = function(a, b) {
|
||||||
if (a.hi > b.hi) {
|
if (a.hi > b.hi) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +109,7 @@ function Long_le(a, b) {
|
||||||
return (a.lo & 1) <= (b.lo & 1);
|
return (a.lo & 1) <= (b.lo & 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Long_add(a, b) {
|
Long_add = function(a, b) {
|
||||||
if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) {
|
if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) {
|
||||||
return Long_fromNumber(a.lo + b.lo);
|
return Long_fromNumber(a.lo + b.lo);
|
||||||
} else if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
|
} else if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
|
||||||
|
@ -98,7 +130,8 @@ function Long_add(a, b) {
|
||||||
var hihi = (a_hihi + b_hihi + (hilo >> 16)) | 0;
|
var hihi = (a_hihi + b_hihi + (hilo >> 16)) | 0;
|
||||||
return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16));
|
return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16));
|
||||||
}
|
}
|
||||||
function Long_inc(a) {
|
|
||||||
|
Long_inc = function(a) {
|
||||||
var lo = (a.lo + 1) | 0;
|
var lo = (a.lo + 1) | 0;
|
||||||
var hi = a.hi;
|
var hi = a.hi;
|
||||||
if (lo === 0) {
|
if (lo === 0) {
|
||||||
|
@ -106,7 +139,8 @@ function Long_inc(a) {
|
||||||
}
|
}
|
||||||
return new Long(lo, hi);
|
return new Long(lo, hi);
|
||||||
}
|
}
|
||||||
function Long_dec(a) {
|
|
||||||
|
Long_dec = function(a) {
|
||||||
var lo = (a.lo - 1) | 0;
|
var lo = (a.lo - 1) | 0;
|
||||||
var hi = a.hi;
|
var hi = a.hi;
|
||||||
if (lo === -1) {
|
if (lo === -1) {
|
||||||
|
@ -114,10 +148,12 @@ function Long_dec(a) {
|
||||||
}
|
}
|
||||||
return new Long(lo, hi);
|
return new Long(lo, hi);
|
||||||
}
|
}
|
||||||
function Long_neg(a) {
|
|
||||||
|
Long_neg = function(a) {
|
||||||
return Long_inc(new Long(a.lo ^ 0xFFFFFFFF, a.hi ^ 0xFFFFFFFF));
|
return Long_inc(new Long(a.lo ^ 0xFFFFFFFF, a.hi ^ 0xFFFFFFFF));
|
||||||
}
|
}
|
||||||
function Long_sub(a, b) {
|
|
||||||
|
Long_sub = function(a, b) {
|
||||||
if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) {
|
if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) {
|
||||||
return Long_fromNumber(a.lo - b.lo);
|
return Long_fromNumber(a.lo - b.lo);
|
||||||
}
|
}
|
||||||
|
@ -136,7 +172,8 @@ function Long_sub(a, b) {
|
||||||
var hihi = (a_hihi - b_hihi + (hilo >> 16)) | 0;
|
var hihi = (a_hihi - b_hihi + (hilo >> 16)) | 0;
|
||||||
return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16));
|
return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16));
|
||||||
}
|
}
|
||||||
function Long_compare(a, b) {
|
|
||||||
|
Long_compare = function(a, b) {
|
||||||
var r = a.hi - b.hi;
|
var r = a.hi - b.hi;
|
||||||
if (r !== 0) {
|
if (r !== 0) {
|
||||||
return r;
|
return r;
|
||||||
|
@ -147,13 +184,8 @@ function Long_compare(a, b) {
|
||||||
}
|
}
|
||||||
return (a.lo & 1) - (b.lo & 1);
|
return (a.lo & 1) - (b.lo & 1);
|
||||||
}
|
}
|
||||||
function Long_isPositive(a) {
|
|
||||||
return (a.hi & 0x80000000) === 0;
|
Long_mul = function(a, b) {
|
||||||
}
|
|
||||||
function Long_isNegative(a) {
|
|
||||||
return (a.hi & 0x80000000) !== 0;
|
|
||||||
}
|
|
||||||
function Long_mul(a, b) {
|
|
||||||
var positive = Long_isNegative(a) === Long_isNegative(b);
|
var positive = Long_isNegative(a) === Long_isNegative(b);
|
||||||
if (Long_isNegative(a)) {
|
if (Long_isNegative(a)) {
|
||||||
a = Long_neg(a);
|
a = Long_neg(a);
|
||||||
|
@ -191,30 +223,35 @@ function Long_mul(a, b) {
|
||||||
var result = new Long((lolo & 0xFFFF) | (lohi << 16), (hilo & 0xFFFF) | (hihi << 16));
|
var result = new Long((lolo & 0xFFFF) | (lohi << 16), (hilo & 0xFFFF) | (hihi << 16));
|
||||||
return positive ? result : Long_neg(result);
|
return positive ? result : Long_neg(result);
|
||||||
}
|
}
|
||||||
function Long_div(a, b) {
|
|
||||||
|
Long_div = function(a, b) {
|
||||||
if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
|
if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
|
||||||
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
|
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
|
||||||
}
|
}
|
||||||
return Long_divRem(a, b)[0];
|
return Long_divRem(a, b)[0];
|
||||||
}
|
}
|
||||||
function Long_udiv(a, b) {
|
|
||||||
|
Long_udiv = function(a, b) {
|
||||||
if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) {
|
if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) {
|
||||||
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
|
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
|
||||||
}
|
}
|
||||||
return Long_udivRem(a, b)[0];
|
return Long_udivRem(a, b)[0];
|
||||||
}
|
}
|
||||||
function Long_rem(a, b) {
|
|
||||||
|
Long_rem = function(a, b) {
|
||||||
if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
|
if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) {
|
||||||
return Long_fromNumber(Long_toNumber(a) % Long_toNumber(b));
|
return Long_fromNumber(Long_toNumber(a) % Long_toNumber(b));
|
||||||
}
|
}
|
||||||
return Long_divRem(a, b)[1];
|
return Long_divRem(a, b)[1];
|
||||||
}
|
}
|
||||||
function Long_urem(a, b) {
|
|
||||||
|
Long_urem = function(a, b) {
|
||||||
if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) {
|
if (a.hi >= 0 && a.hi < Long_MAX_NORMAL && b.hi >= 0 && b.hi < Long_MAX_NORMAL) {
|
||||||
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
|
return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b));
|
||||||
}
|
}
|
||||||
return Long_udivRem(a, b)[1];
|
return Long_udivRem(a, b)[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
function Long_divRem(a, b) {
|
function Long_divRem(a, b) {
|
||||||
if (b.lo === 0 && b.hi === 0) {
|
if (b.lo === 0 && b.hi === 0) {
|
||||||
throw new Error("Division by zero");
|
throw new Error("Division by zero");
|
||||||
|
@ -233,6 +270,7 @@ function Long_divRem(a, b) {
|
||||||
q = new Long(q.lo, q.hi);
|
q = new Long(q.lo, q.hi);
|
||||||
return positive ? [q, a] : [Long_neg(q), Long_neg(a)];
|
return positive ? [q, a] : [Long_neg(q), Long_neg(a)];
|
||||||
}
|
}
|
||||||
|
|
||||||
function Long_udivRem(a, b) {
|
function Long_udivRem(a, b) {
|
||||||
if (b.lo === 0 && b.hi === 0) {
|
if (b.lo === 0 && b.hi === 0) {
|
||||||
throw new Error("Division by zero");
|
throw new Error("Division by zero");
|
||||||
|
@ -244,22 +282,28 @@ function Long_udivRem(a, b) {
|
||||||
q = new Long(q.lo, q.hi);
|
q = new Long(q.lo, q.hi);
|
||||||
return [q, a];
|
return [q, a];
|
||||||
}
|
}
|
||||||
|
|
||||||
function Long_shiftLeft16(a) {
|
function Long_shiftLeft16(a) {
|
||||||
return new Long(a.lo << 16, (a.lo >>> 16) | (a.hi << 16));
|
return new Long(a.lo << 16, (a.lo >>> 16) | (a.hi << 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
function Long_shiftRight16(a) {
|
function Long_shiftRight16(a) {
|
||||||
return new Long((a.lo >>> 16) | (a.hi << 16), a.hi >>> 16);
|
return new Long((a.lo >>> 16) | (a.hi << 16), a.hi >>> 16);
|
||||||
}
|
}
|
||||||
function Long_and(a, b) {
|
|
||||||
|
Long_and = function(a, b) {
|
||||||
return new Long(a.lo & b.lo, a.hi & b.hi);
|
return new Long(a.lo & b.lo, a.hi & b.hi);
|
||||||
}
|
}
|
||||||
function Long_or(a, b) {
|
|
||||||
|
Long_or = function(a, b) {
|
||||||
return new Long(a.lo | b.lo, a.hi | b.hi);
|
return new Long(a.lo | b.lo, a.hi | b.hi);
|
||||||
}
|
}
|
||||||
function Long_xor(a, b) {
|
|
||||||
|
Long_xor = function(a, b) {
|
||||||
return new Long(a.lo ^ b.lo, a.hi ^ b.hi);
|
return new Long(a.lo ^ b.lo, a.hi ^ b.hi);
|
||||||
}
|
}
|
||||||
function Long_shl(a, b) {
|
|
||||||
|
Long_shl = function(a, b) {
|
||||||
b &= 63;
|
b &= 63;
|
||||||
if (b === 0) {
|
if (b === 0) {
|
||||||
return a;
|
return a;
|
||||||
|
@ -271,7 +315,8 @@ function Long_shl(a, b) {
|
||||||
return new Long(0, a.lo << (b - 32));
|
return new Long(0, a.lo << (b - 32));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function Long_shr(a, b) {
|
|
||||||
|
Long_shr = function(a, b) {
|
||||||
b &= 63;
|
b &= 63;
|
||||||
if (b === 0) {
|
if (b === 0) {
|
||||||
return a;
|
return a;
|
||||||
|
@ -283,7 +328,8 @@ function Long_shr(a, b) {
|
||||||
return new Long((a.hi >> (b - 32)), a.hi >> 31);
|
return new Long((a.hi >> (b - 32)), a.hi >> 31);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function Long_shru(a, b) {
|
|
||||||
|
Long_shru = function(a, b) {
|
||||||
b &= 63;
|
b &= 63;
|
||||||
if (b === 0) {
|
if (b === 0) {
|
||||||
return a;
|
return a;
|
||||||
|
@ -295,7 +341,8 @@ function Long_shru(a, b) {
|
||||||
return new Long((a.hi >>> (b - 32)), 0);
|
return new Long((a.hi >>> (b - 32)), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function Long_not(a) {
|
|
||||||
|
Long_not = function(a) {
|
||||||
return new Long(~a.hi, ~a.lo);
|
return new Long(~a.hi, ~a.lo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,6 +352,7 @@ function LongInt(lo, hi, sup) {
|
||||||
this.hi = hi;
|
this.hi = hi;
|
||||||
this.sup = sup;
|
this.sup = sup;
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_mul(a, b) {
|
function LongInt_mul(a, b) {
|
||||||
var a_lolo = ((a.lo & 0xFFFF) * b) | 0;
|
var a_lolo = ((a.lo & 0xFFFF) * b) | 0;
|
||||||
var a_lohi = ((a.lo >>> 16) * b) | 0;
|
var a_lohi = ((a.lo >>> 16) * b) | 0;
|
||||||
|
@ -320,6 +368,7 @@ function LongInt_mul(a, b) {
|
||||||
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
|
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
|
||||||
a.sup = sup & 0xFFFF;
|
a.sup = sup & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_sub(a, b) {
|
function LongInt_sub(a, b) {
|
||||||
var a_lolo = a.lo & 0xFFFF;
|
var a_lolo = a.lo & 0xFFFF;
|
||||||
var a_lohi = a.lo >>> 16;
|
var a_lohi = a.lo >>> 16;
|
||||||
|
@ -339,6 +388,7 @@ function LongInt_sub(a, b) {
|
||||||
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
|
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
|
||||||
a.sup = sup;
|
a.sup = sup;
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_add(a, b) {
|
function LongInt_add(a, b) {
|
||||||
var a_lolo = a.lo & 0xFFFF;
|
var a_lolo = a.lo & 0xFFFF;
|
||||||
var a_lohi = a.lo >>> 16;
|
var a_lohi = a.lo >>> 16;
|
||||||
|
@ -358,6 +408,7 @@ function LongInt_add(a, b) {
|
||||||
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
|
a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16);
|
||||||
a.sup = sup;
|
a.sup = sup;
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_inc(a) {
|
function LongInt_inc(a) {
|
||||||
a.lo = (a.lo + 1) | 0;
|
a.lo = (a.lo + 1) | 0;
|
||||||
if (a.lo === 0) {
|
if (a.lo === 0) {
|
||||||
|
@ -367,6 +418,7 @@ function LongInt_inc(a) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_dec(a) {
|
function LongInt_dec(a) {
|
||||||
a.lo = (a.lo - 1) | 0;
|
a.lo = (a.lo - 1) | 0;
|
||||||
if (a.lo === -1) {
|
if (a.lo === -1) {
|
||||||
|
@ -376,6 +428,7 @@ function LongInt_dec(a) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_ucompare(a, b) {
|
function LongInt_ucompare(a, b) {
|
||||||
var r = (a.sup - b.sup);
|
var r = (a.sup - b.sup);
|
||||||
if (r !== 0) {
|
if (r !== 0) {
|
||||||
|
@ -395,6 +448,7 @@ function LongInt_ucompare(a, b) {
|
||||||
}
|
}
|
||||||
return (a.lo & 1) - (b.lo & 1);
|
return (a.lo & 1) - (b.lo & 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_numOfLeadingZeroBits(a) {
|
function LongInt_numOfLeadingZeroBits(a) {
|
||||||
var n = 0;
|
var n = 0;
|
||||||
var d = 16;
|
var d = 16;
|
||||||
|
@ -407,6 +461,7 @@ function LongInt_numOfLeadingZeroBits(a) {
|
||||||
}
|
}
|
||||||
return 31 - n;
|
return 31 - n;
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_shl(a, b) {
|
function LongInt_shl(a, b) {
|
||||||
if (b === 0) {
|
if (b === 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -433,6 +488,7 @@ function LongInt_shl(a, b) {
|
||||||
a.lo = 0;
|
a.lo = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_shr(a, b) {
|
function LongInt_shr(a, b) {
|
||||||
if (b === 0) {
|
if (b === 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -459,9 +515,11 @@ function LongInt_shr(a, b) {
|
||||||
a.sup = 0;
|
a.sup = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_copy(a) {
|
function LongInt_copy(a) {
|
||||||
return new LongInt(a.lo, a.hi, a.sup);
|
return new LongInt(a.lo, a.hi, a.sup);
|
||||||
}
|
}
|
||||||
|
|
||||||
function LongInt_div(a, b) {
|
function LongInt_div(a, b) {
|
||||||
// Normalize divisor
|
// Normalize divisor
|
||||||
var bits = b.hi !== 0 ? LongInt_numOfLeadingZeroBits(b.hi) : LongInt_numOfLeadingZeroBits(b.lo) + 32;
|
var bits = b.hi !== 0 ? LongInt_numOfLeadingZeroBits(b.hi) : LongInt_numOfLeadingZeroBits(b.lo) + 32;
|
||||||
|
@ -502,3 +560,100 @@ function LongInt_div(a, b) {
|
||||||
LongInt_shr(a, bits + 16);
|
LongInt_shr(a, bits + 16);
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Long_eq = function(a, b) {
|
||||||
|
return a === b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_ne = function(a, b) {
|
||||||
|
return a !== b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_gt = function(a, b) {
|
||||||
|
return a > b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_ge = function(a, b) {
|
||||||
|
return a >= b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_lt = function(a, b) {
|
||||||
|
return a < b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_le = function(a, b) {
|
||||||
|
return a <= b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_add = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a + b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_inc = function(a) {
|
||||||
|
return BigInt.asIntN(64, a + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_dec = function(a) {
|
||||||
|
return BigInt.asIntN(64, a - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_neg = function(a) {
|
||||||
|
return BigInt.asIntN(64, -a);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_sub = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a - b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_compare = function(a, b) {
|
||||||
|
return a < b ? -1 : a > b ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_mul = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a * b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_div = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a / b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_udiv = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, BigInt.asUintN(64, a) / BigInt.asUintN(64, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_rem = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a % b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_urem = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, BigInt.asUintN(64, a) % BigInt.asUintN(64, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_and = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a & b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_or = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a | b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_xor = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a ^ b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_shl = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a << BigInt(b & 63));
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_shr = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, a >> BigInt(b & 63));
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_shru = function(a, b) {
|
||||||
|
return BigInt.asIntN(64, BigInt.asUintN(64, a) >> BigInt(b & 63));
|
||||||
|
}
|
||||||
|
|
||||||
|
Long_not = function(a) {
|
||||||
|
return BigInt.asIntN(64, ~a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -74,17 +74,30 @@ function $rt_wrapArray(cls, data) {
|
||||||
function $rt_createUnfilledArray(cls, sz) {
|
function $rt_createUnfilledArray(cls, sz) {
|
||||||
return new $rt_array(cls, new Array(sz));
|
return new $rt_array(cls, new Array(sz));
|
||||||
}
|
}
|
||||||
function $rt_createLongArray(sz) {
|
function $rt_createNumericArray(cls, nativeArray) {
|
||||||
|
return new $rt_array(cls, nativeArray);
|
||||||
|
}
|
||||||
|
var $rt_createLongArray;
|
||||||
|
var $rt_createLongArrayFromData;
|
||||||
|
if (typeof BigInt !== 'function') {
|
||||||
|
$rt_createLongArray = function(sz) {
|
||||||
var data = new Array(sz);
|
var data = new Array(sz);
|
||||||
var arr = new $rt_array($rt_longcls(), data);
|
var arr = new $rt_array($rt_longcls(), data);
|
||||||
data.fill(Long_ZERO);
|
data.fill(Long_ZERO);
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
function $rt_createLongArrayFromData(init) {
|
$rt_createLongArrayFromData = function(init) {
|
||||||
return new $rt_array($rt_longcls(), init);
|
return new $rt_array($rt_longcls(), init);
|
||||||
}
|
}
|
||||||
function $rt_createNumericArray(cls, nativeArray) {
|
} else {
|
||||||
return new $rt_array(cls, nativeArray);
|
$rt_createLongArray = function (sz) {
|
||||||
|
return $rt_createNumericArray($rt_longcls(), new BigInt64Array(sz));
|
||||||
|
}
|
||||||
|
$rt_createLongArrayFromData = function(data) {
|
||||||
|
var buffer = new BigInt64Array(data.length);
|
||||||
|
buffer.set(data);
|
||||||
|
return $rt_createNumericArray($rt_longcls(), buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function $rt_createCharArray(sz) {
|
function $rt_createCharArray(sz) {
|
||||||
return $rt_createNumericArray($rt_charcls(), new Uint16Array(sz));
|
return $rt_createNumericArray($rt_charcls(), new Uint16Array(sz));
|
||||||
|
@ -630,15 +643,29 @@ function $rt_eraseClinit(target) {
|
||||||
|
|
||||||
var $rt_numberConversionView = new DataView(new ArrayBuffer(8));
|
var $rt_numberConversionView = new DataView(new ArrayBuffer(8));
|
||||||
|
|
||||||
function $rt_doubleToLongBits(n) {
|
var $rt_doubleToLongBits;
|
||||||
|
var $rt_longBitsToDouble;
|
||||||
|
if (typeof BigInt !== 'function') {
|
||||||
|
$rt_doubleToLongBits = function(n) {
|
||||||
$rt_numberConversionView.setFloat64(0, n, true);
|
$rt_numberConversionView.setFloat64(0, n, true);
|
||||||
return new Long($rt_numberConversionView.getInt32(0, true), $rt_numberConversionView.getInt32(4, true));
|
return new Long($rt_numberConversionView.getInt32(0, true), $rt_numberConversionView.getInt32(4, true));
|
||||||
}
|
}
|
||||||
function $rt_longBitsToDouble(n) {
|
$rt_longBitsToDouble = function(n) {
|
||||||
$rt_numberConversionView.setInt32(0, n.lo, true);
|
$rt_numberConversionView.setInt32(0, n.lo, true);
|
||||||
$rt_numberConversionView.setInt32(4, n.hi, true);
|
$rt_numberConversionView.setInt32(4, n.hi, true);
|
||||||
return $rt_numberConversionView.getFloat64(0, true);
|
return $rt_numberConversionView.getFloat64(0, true);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$rt_doubleToLongBits = function(n) {
|
||||||
|
$rt_numberConversionView.setFloat64(0, n, true);
|
||||||
|
return $rt_numberConversionView.getBigInt64(0, true);
|
||||||
|
}
|
||||||
|
$rt_longBitsToDouble = function(n) {
|
||||||
|
$rt_numberConversionView.setBigInt64(0, n, true);
|
||||||
|
return $rt_numberConversionView.getFloat64(0, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function $rt_floatToIntBits(n) {
|
function $rt_floatToIntBits(n) {
|
||||||
$rt_numberConversionView.setFloat32(0, n);
|
$rt_numberConversionView.setFloat32(0, n);
|
||||||
return $rt_numberConversionView.getInt32(0);
|
return $rt_numberConversionView.getInt32(0);
|
||||||
|
@ -697,6 +724,15 @@ function $dbg_class(obj) {
|
||||||
}
|
}
|
||||||
return clsName;
|
return clsName;
|
||||||
}
|
}
|
||||||
|
var Long_MAX_NORMAL = 1 << 18;
|
||||||
|
var Long_ZERO;
|
||||||
|
var Long_create;
|
||||||
|
var Long_fromInt;
|
||||||
|
var Long_fromNumber;
|
||||||
|
var Long_toNumber;
|
||||||
|
var Long_hi;
|
||||||
|
var Long_lo;
|
||||||
|
if (typeof BigInt !== "function") {
|
||||||
function Long(lo, hi) {
|
function Long(lo, hi) {
|
||||||
this.lo = lo | 0;
|
this.lo = lo | 0;
|
||||||
this.hi = hi | 0;
|
this.hi = hi | 0;
|
||||||
|
@ -704,6 +740,15 @@ function Long(lo, hi) {
|
||||||
Long.prototype.__teavm_class__ = function() {
|
Long.prototype.__teavm_class__ = function() {
|
||||||
return "long";
|
return "long";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function Long_isPositive(a) {
|
||||||
|
return (a.hi & 0x80000000) === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Long_isNegative(a) {
|
||||||
|
return (a.hi & 0x80000000) !== 0;
|
||||||
|
}
|
||||||
|
|
||||||
Long.prototype.toString = function() {
|
Long.prototype.toString = function() {
|
||||||
var result = [];
|
var result = [];
|
||||||
var n = this;
|
var n = this;
|
||||||
|
@ -723,21 +768,51 @@ Long.prototype.toString = function() {
|
||||||
Long.prototype.valueOf = function() {
|
Long.prototype.valueOf = function() {
|
||||||
return Long_toNumber(this);
|
return Long_toNumber(this);
|
||||||
};
|
};
|
||||||
var Long_ZERO = new Long(0, 0);
|
|
||||||
var Long_MAX_NORMAL = 1 << 18;
|
Long_ZERO = new Long(0, 0);
|
||||||
function Long_fromInt(val) {
|
Long_fromInt = function(val) {
|
||||||
return new Long(val, (-(val < 0)) | 0);
|
return new Long(val, (-(val < 0)) | 0);
|
||||||
}
|
}
|
||||||
function Long_fromNumber(val) {
|
Long_fromNumber = function(val) {
|
||||||
if (val >= 0) {
|
if (val >= 0) {
|
||||||
return new Long(val | 0, (val / 0x100000000) | 0);
|
return new Long(val | 0, (val / 0x100000000) | 0);
|
||||||
} else {
|
} else {
|
||||||
return Long_neg(new Long(-val | 0, (-val / 0x100000000) | 0));
|
return Long_neg(new Long(-val | 0, (-val / 0x100000000) | 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function Long_toNumber(val) {
|
Long_create = function(lo, hi) {
|
||||||
|
return new Long(hi, lo);
|
||||||
|
}
|
||||||
|
Long_toNumber = function(val) {
|
||||||
return 0x100000000 * val.hi + (val.lo >>> 0);
|
return 0x100000000 * val.hi + (val.lo >>> 0);
|
||||||
}
|
}
|
||||||
|
Long_hi = function(val) {
|
||||||
|
return val.hi;
|
||||||
|
}
|
||||||
|
Long_lo = function(val) {
|
||||||
|
return val.lo;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Long_ZERO = BigInt(0);
|
||||||
|
Long_create = function(lo, hi) {
|
||||||
|
return BigInt.asIntN(64, BigInt(lo) | (BigInt(hi) << BigInt(32)));
|
||||||
|
}
|
||||||
|
Long_fromInt = function(val) {
|
||||||
|
return BigInt(val);
|
||||||
|
}
|
||||||
|
Long_fromNumber = function(val) {
|
||||||
|
return BigInt(val >= 0 ? Math.floor(val) : Math.ceil(val));
|
||||||
|
}
|
||||||
|
Long_toNumber = function(val) {
|
||||||
|
return Number(val);
|
||||||
|
}
|
||||||
|
Long_hi = function(val) {
|
||||||
|
return Number(BigInt.asIntN(64, val >> BigInt(32))) | 0;
|
||||||
|
}
|
||||||
|
Long_lo = function(val) {
|
||||||
|
return Number(BigInt.asIntN(32, val)) | 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
var $rt_imul = Math.imul || function(a, b) {
|
var $rt_imul = Math.imul || function(a, b) {
|
||||||
var ah = (a >>> 16) & 0xFFFF;
|
var ah = (a >>> 16) & 0xFFFF;
|
||||||
var al = a & 0xFFFF;
|
var al = a & 0xFFFF;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user