emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js
1.1 --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Fri Mar 22 16:59:47 2013 +0100
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,520 +0,0 @@
1.4 -// empty line needed here
1.5 -Number.prototype.add32 = function(x) { return (this + x) | 0; };
1.6 -Number.prototype.sub32 = function(x) { return (this - x) | 0; };
1.7 -Number.prototype.mul32 = function(x) {
1.8 - return (((this * (x >> 16)) << 16) + this * (x & 0xFFFF)) | 0;
1.9 -};
1.10 -Number.prototype.neg32 = function() { return (-this) | 0; };
1.11 -
1.12 -Number.prototype.toInt8 = function() { return (this << 24) >> 24; };
1.13 -Number.prototype.toInt16 = function() { return (this << 16) >> 16; };
1.14 -
1.15 -var __m32 = 0xFFFFFFFF;
1.16 -
1.17 -Number.prototype.next32 = function(low) {
1.18 - if (this === 0) {
1.19 - return low;
1.20 - }
1.21 - var l = new Number(low);
1.22 - l.hi = this | 0;
1.23 - return l;
1.24 -};
1.25 -
1.26 -Number.prototype.high32 = function() {
1.27 - return this.hi ? this.hi : (Math.floor(this / (__m32+1))) | 0;
1.28 -};
1.29 -Number.prototype.toInt32 = function() { return this | 0; };
1.30 -Number.prototype.toFP = function() {
1.31 - return this.hi ? this.hi * (__m32+1) + this : this;
1.32 -};
1.33 -Number.prototype.toLong = function() {
1.34 - var hi = (this > __m32) ? (Math.floor(this / (__m32+1))) | 0 : 0;
1.35 - return hi.next32(Math.floor(this % (__m32+1)));
1.36 -};
1.37 -
1.38 -Number.prototype.toExactString = function() {
1.39 - if (this.hi) {
1.40 - // check for Long.MIN_VALUE
1.41 - if ((this.hi == (0x80000000 | 0)) && (this == 0)) {
1.42 - return '-9223372036854775808';
1.43 - }
1.44 - var res = 0;
1.45 - var a = [ 6,9,2,7,6,9,4,9,2,4 ];
1.46 - var s = '';
1.47 - var digit;
1.48 - var neg = this.hi < 0;
1.49 - if (neg) {
1.50 - var x = this.neg64();
1.51 - var hi = x.hi;
1.52 - var low = x;
1.53 - } else {
1.54 - var hi = this.hi;
1.55 - var low = this;
1.56 - }
1.57 - for (var i = 0; i < a.length; i++) {
1.58 - res += hi * a[i];
1.59 - var low_digit = low % 10;
1.60 - digit = (res % 10) + low_digit;
1.61 -
1.62 - low = Math.floor(low / 10);
1.63 - res = Math.floor(res / 10);
1.64 -
1.65 - if (digit >= 10) {
1.66 - digit -= 10;
1.67 - res++;
1.68 - }
1.69 - s = String(digit).concat(s);
1.70 - }
1.71 - s = String(res).concat(s).replace(/^0+/, '');
1.72 - return (neg ? '-' : '').concat(s);
1.73 - }
1.74 - return String(this);
1.75 -};
1.76 -
1.77 -Number.prototype.add64 = function(x) {
1.78 - var low = this + x;
1.79 - carry = 0;
1.80 - if (low > __m32) {
1.81 - carry = 1;
1.82 - low -= (__m32+1);
1.83 - }
1.84 - var hi = (this.high32() + x.high32() + carry) | 0;
1.85 - return hi.next32(low);
1.86 -};
1.87 -
1.88 -Number.prototype.sub64 = function(x) {
1.89 - var low = this - x;
1.90 - carry = 0;
1.91 - if (low < 0) {
1.92 - carry = 1;
1.93 - low += (__m32+1);
1.94 - }
1.95 - var hi = (this.high32() - x.high32() - carry) | 0;
1.96 - return hi.next32(low);
1.97 -};
1.98 -
1.99 -Number.prototype.mul64 = function(x) {
1.100 - var low = this.mul32(x);
1.101 - low += (low < 0) ? (__m32+1) : 0;
1.102 - // first count upper 32 bits of (this.low * x.low)
1.103 - var hi_hi = 0;
1.104 - var hi_low = 0;
1.105 - var m = 1;
1.106 - for (var i = 0; i < 32; i++) {
1.107 - if (x & m) {
1.108 - hi_hi += this >>> 16;
1.109 - hi_low += this & 0xFFFF
1.110 - }
1.111 - hi_low >>= 1;
1.112 - hi_low += (hi_hi & 1) ? 0x8000 : 0;
1.113 - hi_hi >>= 1;
1.114 - m <<= 1;
1.115 - }
1.116 - var hi = (hi_hi << 16) + hi_low;
1.117 -
1.118 - var m1 = this.high32().mul32(x);
1.119 - var m2 = this.mul32(x.high32());
1.120 - hi = hi.add32(m1).add32(m2);
1.121 -
1.122 - return hi.next32(low);
1.123 -};
1.124 -
1.125 -Number.prototype.and64 = function(x) {
1.126 - var low = this & x;
1.127 - low += (low < 0) ? (__m32+1) : 0;
1.128 - if (this.hi && x.hi) {
1.129 - var hi = this.hi & x.hi;
1.130 - return hi.next32(low);
1.131 - };
1.132 - return low;
1.133 -};
1.134 -
1.135 -Number.prototype.or64 = function(x) {
1.136 - var low = this | x;
1.137 - low += (low < 0) ? (__m32+1) : 0;
1.138 - if (this.hi || x.hi) {
1.139 - var hi = this.hi | x.hi;
1.140 - return hi.next32(low);
1.141 - };
1.142 - return low;
1.143 -};
1.144 -
1.145 -Number.prototype.xor64 = function(x) {
1.146 - var low = this ^ x;
1.147 - low += (low < 0) ? (__m32+1) : 0;
1.148 - if (this.hi || x.hi) {
1.149 - var hi = this.hi ^ x.hi;
1.150 - return hi.next32(low);
1.151 - };
1.152 - return low;
1.153 -};
1.154 -
1.155 -Number.prototype.shl64 = function(x) {
1.156 - if (x >= 32) {
1.157 - var hi = this << (x - 32);
1.158 - return hi.next32(0);
1.159 - } else {
1.160 - var hi = this.high32() << x;
1.161 - var low_reminder = this >> (32 - x);
1.162 - hi |= low_reminder;
1.163 - var low = this << x;
1.164 - low += (low < 0) ? (__m32+1) : 0;
1.165 - return hi.next32(low);
1.166 - }
1.167 -};
1.168 -
1.169 -Number.prototype.shr64 = function(x) {
1.170 - if (x >= 32) {
1.171 - var low = this.high32() >> (x - 32);
1.172 - low += (low < 0) ? (__m32+1) : 0;
1.173 - return low;
1.174 - } else {
1.175 - var low = this >> x;
1.176 - var hi_reminder = this.high32() << (32 - x);
1.177 - low |= hi_reminder;
1.178 - low += (low < 0) ? (__m32+1) : 0;
1.179 - var hi = this.high32() >> x;
1.180 - return hi.next32(low);
1.181 - }
1.182 -};
1.183 -
1.184 -Number.prototype.ushr64 = function(x) {
1.185 - if (x >= 32) {
1.186 - var low = this.high32() >>> (x - 32);
1.187 - low += (low < 0) ? (__m32+1) : 0;
1.188 - return low;
1.189 - } else {
1.190 - var low = this >>> x;
1.191 - var hi_reminder = this.high32() << (32 - x);
1.192 - low |= hi_reminder;
1.193 - low += (low < 0) ? (__m32+1) : 0;
1.194 - var hi = this.high32() >>> x;
1.195 - return hi.next32(low);
1.196 - }
1.197 -};
1.198 -
1.199 -Number.prototype.compare64 = function(x) {
1.200 - if (this.high32() === x.high32()) {
1.201 - return (this < x) ? -1 : ((this > x) ? 1 : 0);
1.202 - }
1.203 - return (this.high32() < x.high32()) ? -1 : 1;
1.204 -};
1.205 -
1.206 -Number.prototype.neg64 = function() {
1.207 - var hi = this.high32();
1.208 - var low = this;
1.209 - if ((hi === 0) && (low < 0)) { return -low; }
1.210 - hi = ~hi;
1.211 - low = ~low;
1.212 - low += (low < 0) ? (__m32+1) : 0;
1.213 - var ret = hi.next32(low);
1.214 - return ret.add64(1);
1.215 -};
1.216 -
1.217 -(function(numberPrototype) {
1.218 - function __Int64(hi32, lo32) {
1.219 - this.hi32 = hi32 | 0;
1.220 - this.lo32 = lo32 | 0;
1.221 -
1.222 - this.get32 = function(bitIndex) {
1.223 - var v0;
1.224 - var v1;
1.225 - bitIndex += 32;
1.226 - var selector = bitIndex >>> 5;
1.227 - switch (selector) {
1.228 - case 0:
1.229 - v0 = 0;
1.230 - v1 = this.lo32;
1.231 - break;
1.232 - case 1:
1.233 - v0 = this.lo32;
1.234 - v1 = this.hi32;
1.235 - break;
1.236 - case 2:
1.237 - v0 = this.hi32;
1.238 - v1 = 0;
1.239 - break
1.240 - default:
1.241 - return 0;
1.242 - }
1.243 -
1.244 - var shift = bitIndex & 31;
1.245 - if (shift === 0) {
1.246 - return v0;
1.247 - }
1.248 -
1.249 - return (v1 << (32 - shift)) | (v0 >>> shift);
1.250 - }
1.251 -
1.252 - this.get16 = function(bitIndex) {
1.253 - return this.get32(bitIndex) & 0xffff;
1.254 - }
1.255 -
1.256 - this.set16 = function(bitIndex, value) {
1.257 - bitIndex += 32;
1.258 - var shift = bitIndex & 15;
1.259 - var svalue = (value & 0xffff) << shift;
1.260 - var smask = 0xffff << shift;
1.261 - var selector = bitIndex >>> 4;
1.262 - switch (selector) {
1.263 - case 0:
1.264 - break;
1.265 - case 1:
1.266 - this.lo32 = (this.lo32 & ~(smask >>> 16))
1.267 - | (svalue >>> 16);
1.268 - break;
1.269 - case 2:
1.270 - this.lo32 = (this.lo32 & ~smask) | svalue;
1.271 - break;
1.272 - case 3:
1.273 - this.lo32 = (this.lo32 & ~(smask << 16))
1.274 - | (svalue << 16);
1.275 - this.hi32 = (this.hi32 & ~(smask >>> 16))
1.276 - | (svalue >>> 16);
1.277 - break;
1.278 - case 4:
1.279 - this.hi32 = (this.hi32 & ~smask) | svalue;
1.280 - break;
1.281 - case 5:
1.282 - this.hi32 = (this.hi32 & ~(smask << 16))
1.283 - | (svalue << 16);
1.284 - break;
1.285 - }
1.286 - }
1.287 -
1.288 - this.getDigit = function(index, shift) {
1.289 - return this.get16((index << 4) - shift);
1.290 - }
1.291 -
1.292 - this.getTwoDigits = function(index, shift) {
1.293 - return this.get32(((index - 1) << 4) - shift);
1.294 - }
1.295 -
1.296 - this.setDigit = function(index, shift, value) {
1.297 - this.set16((index << 4) - shift, value);
1.298 - }
1.299 -
1.300 - this.countSignificantDigits = function() {
1.301 - var sd;
1.302 - var remaining;
1.303 -
1.304 - if (this.hi32 === 0) {
1.305 - if (this.lo32 === 0) {
1.306 - return 0;
1.307 - }
1.308 -
1.309 - sd = 2;
1.310 - remaining = this.lo32;
1.311 - } else {
1.312 - sd = 4;
1.313 - remaining = this.hi32;
1.314 - }
1.315 -
1.316 - if (remaining < 0) {
1.317 - return sd;
1.318 - }
1.319 -
1.320 - return (remaining < 65536) ? sd - 1 : sd;
1.321 - }
1.322 -
1.323 - this.toNumber = function() {
1.324 - var lo32 = this.lo32;
1.325 - if (lo32 < 0) {
1.326 - lo32 += 0x100000000;
1.327 - }
1.328 -
1.329 - return this.hi32.next32(lo32);
1.330 - }
1.331 - }
1.332 -
1.333 - function __countLeadingZeroes16(number) {
1.334 - var nlz = 0;
1.335 -
1.336 - if (number < 256) {
1.337 - nlz += 8;
1.338 - number <<= 8;
1.339 - }
1.340 -
1.341 - if (number < 4096) {
1.342 - nlz += 4;
1.343 - number <<= 4;
1.344 - }
1.345 -
1.346 - if (number < 16384) {
1.347 - nlz += 2;
1.348 - number <<= 2;
1.349 - }
1.350 -
1.351 - return (number < 32768) ? nlz + 1 : nlz;
1.352 - }
1.353 -
1.354 - // q = u / v; r = u - q * v;
1.355 - // v != 0
1.356 - function __div64(q, r, u, v) {
1.357 - var m = u.countSignificantDigits();
1.358 - var n = v.countSignificantDigits();
1.359 -
1.360 - q.hi32 = q.lo32 = 0;
1.361 -
1.362 - if (n === 1) {
1.363 - // v has single digit
1.364 - var vd = v.getDigit(0, 0);
1.365 - var carry = 0;
1.366 - for (var i = m - 1; i >= 0; --i) {
1.367 - var ui = (carry << 16) | u.getDigit(i, 0);
1.368 - if (ui < 0) {
1.369 - ui += 0x100000000;
1.370 - }
1.371 - var qi = (ui / vd) | 0;
1.372 - q.setDigit(i, 0, qi);
1.373 - carry = ui - qi * vd;
1.374 - }
1.375 -
1.376 - r.hi32 = 0;
1.377 - r.lo32 = carry;
1.378 - return;
1.379 - }
1.380 -
1.381 - r.hi32 = u.hi32;
1.382 - r.lo32 = u.lo32;
1.383 -
1.384 - if (m < n) {
1.385 - return;
1.386 - }
1.387 -
1.388 - // Normalize
1.389 - var nrm = __countLeadingZeroes16(v.getDigit(n - 1, 0));
1.390 -
1.391 - var vd1 = v.getDigit(n - 1, nrm);
1.392 - var vd0 = v.getDigit(n - 2, nrm);
1.393 - for (var j = m - n; j >= 0; --j) {
1.394 - // Calculate qj estimate
1.395 - var ud21 = r.getTwoDigits(j + n, nrm);
1.396 - var ud2 = ud21 >>> 16;
1.397 - if (ud21 < 0) {
1.398 - ud21 += 0x100000000;
1.399 - }
1.400 -
1.401 - var qest = (ud2 === vd1) ? 0xFFFF : ((ud21 / vd1) | 0);
1.402 - var rest = ud21 - qest * vd1;
1.403 -
1.404 - // 0 <= (qest - qj) <= 2
1.405 -
1.406 - // Refine qj estimate
1.407 - var ud0 = r.getDigit(j + n - 2, nrm);
1.408 - while ((qest * vd0) > ((rest * 0x10000) + ud0)) {
1.409 - --qest;
1.410 - rest += vd1;
1.411 - }
1.412 -
1.413 - // 0 <= (qest - qj) <= 1
1.414 -
1.415 - // Multiply and subtract
1.416 - var carry = 0;
1.417 - for (var i = 0; i < n; ++i) {
1.418 - var vi = qest * v.getDigit(i, nrm);
1.419 - var ui = r.getDigit(i + j, nrm) - carry - (vi & 0xffff);
1.420 - r.setDigit(i + j, nrm, ui);
1.421 - carry = (vi >>> 16) - (ui >> 16);
1.422 - }
1.423 - var uj = ud2 - carry;
1.424 -
1.425 - if (uj < 0) {
1.426 - // qest - qj = 1
1.427 -
1.428 - // Add back
1.429 - --qest;
1.430 - var carry = 0;
1.431 - for (var i = 0; i < n; ++i) {
1.432 - var ui = r.getDigit(i + j, nrm) + v.getDigit(i, nrm)
1.433 - + carry;
1.434 - r.setDigit(i + j, nrm, ui);
1.435 - carry = ui >> 16;
1.436 - }
1.437 - uj += carry;
1.438 - }
1.439 -
1.440 - q.setDigit(j, 0, qest);
1.441 - r.setDigit(j + n, nrm, uj);
1.442 - }
1.443 - }
1.444 -
1.445 - numberPrototype.div64 = function(x) {
1.446 - var negateResult = false;
1.447 - var u, v;
1.448 -
1.449 - if ((this.high32() & 0x80000000) != 0) {
1.450 - u = this.neg64();
1.451 - negateResult = !negateResult;
1.452 - } else {
1.453 - u = this;
1.454 - }
1.455 -
1.456 - if ((x.high32() & 0x80000000) != 0) {
1.457 - v = x.neg64();
1.458 - negateResult = !negateResult;
1.459 - } else {
1.460 - v = x;
1.461 - }
1.462 -
1.463 - if ((v === 0) && (v.high32() === 0)) {
1.464 - // TODO: throw
1.465 - }
1.466 -
1.467 - if (u.high32() === 0) {
1.468 - if (v.high32() === 0) {
1.469 - var result = (u / v) | 0;
1.470 - return negateResult ? result.neg64() : result;
1.471 - }
1.472 -
1.473 - return 0;
1.474 - }
1.475 -
1.476 - var u64 = new __Int64(u.high32(), u);
1.477 - var v64 = new __Int64(v.high32(), v);
1.478 - var q64 = new __Int64(0, 0);
1.479 - var r64 = new __Int64(0, 0);
1.480 -
1.481 - __div64(q64, r64, u64, v64);
1.482 -
1.483 - var result = q64.toNumber();
1.484 - return negateResult ? result.neg64() : result;
1.485 - }
1.486 -
1.487 - numberPrototype.mod64 = function(x) {
1.488 - var negateResult = false;
1.489 - var u, v;
1.490 -
1.491 - if ((this.high32() & 0x80000000) != 0) {
1.492 - u = this.neg64();
1.493 - negateResult = !negateResult;
1.494 - } else {
1.495 - u = this;
1.496 - }
1.497 -
1.498 - if ((x.high32() & 0x80000000) != 0) {
1.499 - v = x.neg64();
1.500 - } else {
1.501 - v = x;
1.502 - }
1.503 -
1.504 - if ((v === 0) && (v.high32() === 0)) {
1.505 - // TODO: throw
1.506 - }
1.507 -
1.508 - if (u.high32() === 0) {
1.509 - var result = (v.high32() === 0) ? (u % v) : u;
1.510 - return negateResult ? result.neg64() : result;
1.511 - }
1.512 -
1.513 - var u64 = new __Int64(u.high32(), u);
1.514 - var v64 = new __Int64(v.high32(), v);
1.515 - var q64 = new __Int64(0, 0);
1.516 - var r64 = new __Int64(0, 0);
1.517 -
1.518 - __div64(q64, r64, u64, v64);
1.519 -
1.520 - var result = r64.toNumber();
1.521 - return negateResult ? result.neg64() : result;
1.522 - }
1.523 -})(Number.prototype);