rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 27 Feb 2015 19:28:07 +0100
changeset 1800 65cab8539582
parent 1761 d2a5a7a0e167
child 1857 f1344425bcb1
child 1950 71e5cd5b29bc
permissions -rw-r--r--
Probably faster to use the conditional operator than to call additional compact function
Martin@438
     1
// empty line needed here
Martin@439
     2
jaroslav@912
     3
(function(numberPrototype) {
jaroslav@912
     4
    numberPrototype.add32 = function(x) {
jaroslav@912
     5
        return (this + x) | 0;
jaroslav@912
     6
    };
jaroslav@912
     7
    numberPrototype.sub32 = function(x) {
jaroslav@912
     8
        return (this - x) | 0;
jaroslav@912
     9
    };
jaroslav@912
    10
    numberPrototype.mul32 = function(x) {
jaroslav@912
    11
        return (((this * (x >> 16)) << 16) + this * (x & 0xFFFF)) | 0;
jaroslav@912
    12
    };
jaroslav@912
    13
    numberPrototype.neg32 = function() {
jaroslav@912
    14
        return (-this) | 0;
jaroslav@912
    15
    };
Martin@582
    16
jaroslav@912
    17
    numberPrototype.toInt8 = function() {
jaroslav@912
    18
        return (this << 24) >> 24;
jaroslav@912
    19
    };
jaroslav@912
    20
    numberPrototype.toInt16 = function() {
jaroslav@912
    21
        return (this << 16) >> 16;
jaroslav@912
    22
    };
Martin@615
    23
jaroslav@912
    24
    var __m32 = 0xFFFFFFFF;
Martin@582
    25
jaroslav@912
    26
    numberPrototype.next32 = function(low) {
jaroslav@912
    27
        if (this === 0) {
jaroslav@912
    28
            return low;
jaroslav@912
    29
        }
jaroslav@912
    30
        var l = new Number(low);
jaroslav@912
    31
        l.hi = this | 0;
jaroslav@912
    32
        return l;
jaroslav@912
    33
    };
lubomir@778
    34
jaroslav@912
    35
    numberPrototype.high32 = function() {
jaroslav@912
    36
        return this.hi ? this.hi : (Math.floor(this / (__m32 + 1))) | 0;
jaroslav@912
    37
    };
jaroslav@912
    38
    numberPrototype.toInt32 = function() {
jaroslav@912
    39
        return this | 0;
jaroslav@912
    40
    };
jaroslav@912
    41
    numberPrototype.toFP = function() {
jaroslav@912
    42
        return this.hi ? this.hi * (__m32 + 1) + this : this;
jaroslav@912
    43
    };
jaroslav@912
    44
    numberPrototype.toLong = function() {
jaroslav@912
    45
        var hi = (this / (__m32 + 1)) | 0;
jaroslav@912
    46
        var low = (this % (__m32 + 1)) | 0;
jaroslav@912
    47
        if (low < 0) {
jaroslav@912
    48
            low += __m32 + 1;
jaroslav@912
    49
        }
Martin@607
    50
jaroslav@912
    51
        if (this < 0) {
jaroslav@912
    52
            hi -= 1;
Martin@698
    53
        }
Martin@607
    54
Martin@615
    55
        return hi.next32(low);
Martin@615
    56
    };
Martin@615
    57
jaroslav@912
    58
    numberPrototype.toExactString = function() {
jaroslav@912
    59
        if (this.hi) {
jaroslav@912
    60
            // check for Long.MIN_VALUE
jaroslav@912
    61
            if ((this.hi == (0x80000000 | 0)) && (this == 0)) {
jaroslav@912
    62
                return '-9223372036854775808';
jaroslav@912
    63
            }
jaroslav@912
    64
            var res = 0;
jaroslav@912
    65
            var a = [6, 9, 2, 7, 6, 9, 4, 9, 2, 4];
jaroslav@912
    66
            var s = '';
jaroslav@912
    67
            var digit;
jaroslav@912
    68
            var neg = this.hi < 0;
jaroslav@912
    69
            if (neg) {
jaroslav@912
    70
                var x = this.neg64();
jaroslav@912
    71
                var hi = x.hi;
jaroslav@912
    72
                var low = x;
jaroslav@912
    73
            } else {
jaroslav@912
    74
                var hi = this.hi;
jaroslav@912
    75
                var low = this;
jaroslav@912
    76
            }
jaroslav@912
    77
            for (var i = 0; i < a.length; i++) {
jaroslav@912
    78
                res += hi * a[i];
jaroslav@912
    79
                var low_digit = low % 10;
jaroslav@912
    80
                digit = (res % 10) + low_digit;
jaroslav@912
    81
jaroslav@912
    82
                low = Math.floor(low / 10);
jaroslav@912
    83
                res = Math.floor(res / 10);
jaroslav@912
    84
jaroslav@912
    85
                if (digit >= 10) {
jaroslav@912
    86
                    digit -= 10;
jaroslav@912
    87
                    res++;
jaroslav@912
    88
                }
jaroslav@912
    89
                s = String(digit).concat(s);
jaroslav@912
    90
            }
jaroslav@912
    91
            s = String(res).concat(s).replace(/^0+/, '');
jaroslav@912
    92
            return (neg ? '-' : '').concat(s);
jaroslav@912
    93
        }
jaroslav@912
    94
        return String(this);
jaroslav@912
    95
    };
jaroslav@912
    96
jaroslav@912
    97
    numberPrototype.add64 = function(x) {
jaroslav@912
    98
        var low = this + x;
jaroslav@912
    99
        carry = 0;
jaroslav@912
   100
        if (low > __m32) {
jaroslav@912
   101
            carry = 1;
jaroslav@912
   102
            low -= (__m32 + 1);
jaroslav@912
   103
        }
jaroslav@912
   104
        var hi = (this.high32() + x.high32() + carry) | 0;
Martin@627
   105
        return hi.next32(low);
Martin@627
   106
    };
Martin@627
   107
jaroslav@912
   108
    numberPrototype.sub64 = function(x) {
jaroslav@912
   109
        var low = this - x;
jaroslav@912
   110
        carry = 0;
jaroslav@912
   111
        if (low < 0) {
jaroslav@912
   112
            carry = 1;
jaroslav@912
   113
            low += (__m32 + 1);
jaroslav@912
   114
        }
jaroslav@912
   115
        var hi = (this.high32() - x.high32() - carry) | 0;
Martin@628
   116
        return hi.next32(low);
Martin@628
   117
    };
Martin@628
   118
jaroslav@912
   119
    numberPrototype.mul64 = function(x) {
jaroslav@912
   120
        var low = this.mul32(x);
jaroslav@912
   121
        low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   122
        // first count upper 32 bits of (this.low * x.low)
jaroslav@912
   123
        var hi_hi = 0;
jaroslav@912
   124
        var hi_low = 0;
jaroslav@912
   125
        var m = 1;
jaroslav@912
   126
        for (var i = 0; i < 32; i++) {
jaroslav@912
   127
            if (x & m) {
jaroslav@912
   128
                hi_hi += this >>> 16;
jaroslav@912
   129
                hi_low += this & 0xFFFF
jaroslav@912
   130
            }
jaroslav@912
   131
            hi_low >>= 1;
jaroslav@912
   132
            hi_low += (hi_hi & 1) ? 0x8000 : 0;
jaroslav@912
   133
            hi_hi >>= 1;
jaroslav@912
   134
            m <<= 1;
jaroslav@912
   135
        }
jaroslav@912
   136
        var hi = (hi_hi << 16) + hi_low;
jaroslav@912
   137
jaroslav@912
   138
        var m1 = this.high32().mul32(x);
jaroslav@912
   139
        var m2 = this.mul32(x.high32());
jaroslav@912
   140
        hi = hi.add32(m1).add32(m2);
jaroslav@912
   141
Martin@594
   142
        return hi.next32(low);
jaroslav@912
   143
    };
Martin@582
   144
jaroslav@912
   145
    numberPrototype.and64 = function(x) {
jaroslav@912
   146
        var low = this & x;
jaroslav@912
   147
        low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   148
        if (this.hi && x.hi) {
jaroslav@912
   149
            var hi = this.hi & x.hi;
jaroslav@912
   150
            return hi.next32(low);
jaroslav@912
   151
        }
jaroslav@912
   152
        ;
Martin@615
   153
        return low;
jaroslav@912
   154
    };
Martin@615
   155
jaroslav@912
   156
    numberPrototype.or64 = function(x) {
jaroslav@912
   157
        var low = this | x;
jaroslav@912
   158
        low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   159
        if (this.hi || x.hi) {
jaroslav@912
   160
            var hi = this.hi | x.hi;
jaroslav@912
   161
            return hi.next32(low);
jaroslav@912
   162
        }
jaroslav@912
   163
        ;
Martin@629
   164
        return low;
jaroslav@912
   165
    };
Martin@629
   166
jaroslav@912
   167
    numberPrototype.xor64 = function(x) {
jaroslav@912
   168
        var low = this ^ x;
jaroslav@912
   169
        low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   170
        if (this.hi || x.hi) {
jaroslav@912
   171
            var hi = this.hi ^ x.hi;
jaroslav@912
   172
            return hi.next32(low);
jaroslav@912
   173
        }
jaroslav@912
   174
        ;
jaroslav@912
   175
        return low;
jaroslav@912
   176
    };
Martin@630
   177
jaroslav@912
   178
    numberPrototype.shl64 = function(x) {
Martin@1352
   179
        x &= 0x3f;
Martin@1352
   180
        if (x == 0) return this;
jaroslav@912
   181
        if (x >= 32) {
jaroslav@912
   182
            var hi = this << (x - 32);
jaroslav@912
   183
            return hi.next32(0);
jaroslav@912
   184
        } else {
jaroslav@912
   185
            var hi = this.high32() << x;
jaroslav@912
   186
            var low_reminder = this >> (32 - x);
jaroslav@912
   187
            hi |= low_reminder;
jaroslav@912
   188
            var low = this << x;
jaroslav@912
   189
            low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   190
            return hi.next32(low);
jaroslav@912
   191
        }
jaroslav@912
   192
    };
lubomir@676
   193
jaroslav@912
   194
    numberPrototype.shr64 = function(x) {
Martin@1352
   195
        x &= 0x3f;
Martin@1352
   196
        if (x == 0) return this;
jaroslav@912
   197
        if (x >= 32) {
jaroslav@912
   198
            var low = this.high32() >> (x - 32);
jaroslav@912
   199
            low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   200
            return low;
jaroslav@912
   201
        } else {
jaroslav@1761
   202
            var low = this >>> x;
jaroslav@912
   203
            var hi_reminder = this.high32() << (32 - x);
jaroslav@912
   204
            low |= hi_reminder;
jaroslav@912
   205
            low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   206
            var hi = this.high32() >> x;
jaroslav@912
   207
            return hi.next32(low);
jaroslav@912
   208
        }
jaroslav@912
   209
    };
jaroslav@912
   210
jaroslav@912
   211
    numberPrototype.ushr64 = function(x) {
Martin@1352
   212
        x &= 0x3f;
Martin@1352
   213
        if (x == 0) return this;
jaroslav@912
   214
        if (x >= 32) {
jaroslav@912
   215
            var low = this.high32() >>> (x - 32);
jaroslav@912
   216
            low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   217
            return low;
jaroslav@912
   218
        } else {
jaroslav@912
   219
            var low = this >>> x;
jaroslav@912
   220
            var hi_reminder = this.high32() << (32 - x);
jaroslav@912
   221
            low |= hi_reminder;
jaroslav@912
   222
            low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   223
            var hi = this.high32() >>> x;
jaroslav@912
   224
            return hi.next32(low);
jaroslav@912
   225
        }
jaroslav@912
   226
    };
jaroslav@1800
   227
jaroslav@1800
   228
    // keeping for compatibility with generated bck2brwsr.js library files
jaroslav@1800
   229
    // not used since 0.14
jaroslav@1477
   230
    numberPrototype.compare = function(x) {
jaroslav@1477
   231
        if (this == x) {
jaroslav@1477
   232
            return 0;
jaroslav@1477
   233
        } else {
jaroslav@1477
   234
            return (this < x) ? -1 : 1;
jaroslav@1477
   235
        }
jaroslav@1477
   236
    };
jaroslav@912
   237
jaroslav@912
   238
    numberPrototype.compare64 = function(x) {
jaroslav@912
   239
        if (this.high32() === x.high32()) {
jaroslav@912
   240
            return (this < x) ? -1 : ((this > x) ? 1 : 0);
jaroslav@912
   241
        }
jaroslav@912
   242
        return (this.high32() < x.high32()) ? -1 : 1;
jaroslav@912
   243
    };
jaroslav@912
   244
jaroslav@912
   245
    numberPrototype.neg64 = function() {
jaroslav@912
   246
        var hi = this.high32();
jaroslav@912
   247
        var low = this;
jaroslav@912
   248
        if ((hi === 0) && (low < 0)) {
jaroslav@912
   249
            return -low;
jaroslav@912
   250
        }
jaroslav@912
   251
        hi = ~hi;
jaroslav@912
   252
        low = ~low;
jaroslav@912
   253
        low += (low < 0) ? (__m32 + 1) : 0;
jaroslav@912
   254
        var ret = hi.next32(low);
jaroslav@912
   255
        return ret.add64(1);
jaroslav@912
   256
    };
jaroslav@912
   257
    
lubomir@737
   258
    function __handleDivByZero() {
lubomir@737
   259
        var exception = new vm.java_lang_ArithmeticException;
lubomir@737
   260
        vm.java_lang_ArithmeticException(false).constructor
lubomir@737
   261
          .cons__VLjava_lang_String_2.call(exception, "/ by zero");
lubomir@737
   262
lubomir@737
   263
        throw exception;
lubomir@737
   264
    }
lubomir@737
   265
lubomir@676
   266
    function __Int64(hi32, lo32) {
lubomir@676
   267
        this.hi32 = hi32 | 0;
lubomir@676
   268
        this.lo32 = lo32 | 0;
lubomir@676
   269
lubomir@676
   270
        this.get32 = function(bitIndex) {
lubomir@676
   271
            var v0;
lubomir@676
   272
            var v1;
lubomir@676
   273
            bitIndex += 32;
lubomir@676
   274
            var selector = bitIndex >>> 5;
lubomir@676
   275
            switch (selector) {
lubomir@676
   276
                case 0:
lubomir@676
   277
                    v0 = 0;
lubomir@676
   278
                    v1 = this.lo32;
lubomir@676
   279
                    break;
lubomir@676
   280
                case 1:
lubomir@676
   281
                    v0 = this.lo32;
lubomir@676
   282
                    v1 = this.hi32;
lubomir@676
   283
                    break;
lubomir@676
   284
                case 2:
lubomir@676
   285
                    v0 = this.hi32;
lubomir@676
   286
                    v1 = 0;
lubomir@676
   287
                    break
lubomir@676
   288
                default:
lubomir@676
   289
                    return 0;
lubomir@676
   290
            }
lubomir@676
   291
lubomir@676
   292
            var shift = bitIndex & 31;
lubomir@676
   293
            if (shift === 0) {
lubomir@676
   294
                return v0;
lubomir@676
   295
            }
lubomir@676
   296
lubomir@676
   297
            return (v1 << (32 - shift)) | (v0 >>> shift);
lubomir@676
   298
        }
lubomir@676
   299
lubomir@676
   300
        this.get16 = function(bitIndex) {
lubomir@676
   301
            return this.get32(bitIndex) & 0xffff;
lubomir@676
   302
        }
lubomir@676
   303
lubomir@676
   304
        this.set16 = function(bitIndex, value) {
lubomir@676
   305
            bitIndex += 32;
lubomir@676
   306
            var shift = bitIndex & 15;
lubomir@676
   307
            var svalue = (value & 0xffff) << shift; 
lubomir@676
   308
            var smask = 0xffff << shift;
lubomir@676
   309
            var selector = bitIndex >>> 4;
lubomir@676
   310
            switch (selector) {
lubomir@676
   311
                case 0:
lubomir@676
   312
                    break;
lubomir@676
   313
                case 1:
lubomir@676
   314
                    this.lo32 = (this.lo32 & ~(smask >>> 16))
lubomir@676
   315
                                    | (svalue >>> 16);
lubomir@676
   316
                    break;
lubomir@676
   317
                case 2:
lubomir@676
   318
                    this.lo32 = (this.lo32 & ~smask) | svalue;
lubomir@676
   319
                    break;
lubomir@676
   320
                case 3:
lubomir@676
   321
                    this.lo32 = (this.lo32 & ~(smask << 16))
lubomir@676
   322
                                    | (svalue << 16);
lubomir@676
   323
                    this.hi32 = (this.hi32 & ~(smask >>> 16))
lubomir@676
   324
                                    | (svalue >>> 16);
lubomir@676
   325
                    break;
lubomir@676
   326
                case 4:
lubomir@676
   327
                    this.hi32 = (this.hi32 & ~smask) | svalue;
lubomir@676
   328
                    break;
lubomir@676
   329
                case 5:
lubomir@676
   330
                    this.hi32 = (this.hi32 & ~(smask << 16))
lubomir@676
   331
                                    | (svalue << 16);
lubomir@676
   332
                    break;
lubomir@676
   333
            }
lubomir@676
   334
        }
lubomir@676
   335
lubomir@676
   336
        this.getDigit = function(index, shift) {
lubomir@676
   337
            return this.get16((index << 4) - shift);
lubomir@676
   338
        }
lubomir@676
   339
lubomir@676
   340
        this.getTwoDigits = function(index, shift) {
lubomir@676
   341
            return this.get32(((index - 1) << 4) - shift);
lubomir@676
   342
        }
lubomir@676
   343
lubomir@676
   344
        this.setDigit = function(index, shift, value) {
lubomir@676
   345
            this.set16((index << 4) - shift, value);
lubomir@676
   346
        }
lubomir@676
   347
lubomir@676
   348
        this.countSignificantDigits = function() {
lubomir@676
   349
            var sd;
lubomir@676
   350
            var remaining;
lubomir@676
   351
lubomir@676
   352
            if (this.hi32 === 0) {
lubomir@676
   353
                if (this.lo32 === 0) {
lubomir@676
   354
                    return 0;
lubomir@676
   355
                }
lubomir@676
   356
lubomir@676
   357
                sd = 2;
lubomir@676
   358
                remaining = this.lo32;
lubomir@676
   359
            } else {
lubomir@676
   360
                sd = 4;
lubomir@676
   361
                remaining = this.hi32;
lubomir@676
   362
            }
lubomir@676
   363
lubomir@676
   364
            if (remaining < 0) {
lubomir@676
   365
                return sd;
lubomir@676
   366
            }
lubomir@676
   367
lubomir@676
   368
            return (remaining < 65536) ? sd - 1 : sd;
lubomir@676
   369
        }
lubomir@676
   370
        
lubomir@676
   371
        this.toNumber = function() {
lubomir@676
   372
            var lo32 = this.lo32;
lubomir@676
   373
            if (lo32 < 0) {
lubomir@676
   374
                lo32 += 0x100000000;
lubomir@676
   375
            }
lubomir@676
   376
lubomir@676
   377
            return this.hi32.next32(lo32);
lubomir@676
   378
        }
lubomir@676
   379
    }
lubomir@676
   380
lubomir@676
   381
    function __countLeadingZeroes16(number) {
lubomir@676
   382
        var nlz = 0;
lubomir@676
   383
lubomir@676
   384
        if (number < 256) {
lubomir@676
   385
            nlz += 8;
lubomir@676
   386
            number <<= 8;
lubomir@676
   387
        }
lubomir@676
   388
lubomir@676
   389
        if (number < 4096) {
lubomir@676
   390
            nlz += 4;
lubomir@676
   391
            number <<= 4;
lubomir@676
   392
        }
lubomir@676
   393
lubomir@676
   394
        if (number < 16384) {
lubomir@676
   395
            nlz += 2;
lubomir@676
   396
            number <<= 2;
lubomir@676
   397
        }
lubomir@676
   398
lubomir@676
   399
        return (number < 32768) ? nlz + 1 : nlz;
lubomir@676
   400
    }
lubomir@676
   401
    
lubomir@676
   402
    // q = u / v; r = u - q * v;
lubomir@676
   403
    // v != 0
lubomir@676
   404
    function __div64(q, r, u, v) {
lubomir@676
   405
        var m = u.countSignificantDigits();
lubomir@676
   406
        var n = v.countSignificantDigits();
lubomir@676
   407
lubomir@676
   408
        q.hi32 = q.lo32 = 0;
lubomir@676
   409
lubomir@676
   410
        if (n === 1) {
lubomir@676
   411
            // v has single digit
lubomir@676
   412
            var vd = v.getDigit(0, 0);
lubomir@676
   413
            var carry = 0;
lubomir@676
   414
            for (var i = m - 1; i >= 0; --i) {
lubomir@676
   415
                var ui = (carry << 16) | u.getDigit(i, 0);
lubomir@676
   416
                if (ui < 0) {
lubomir@676
   417
                    ui += 0x100000000;
lubomir@676
   418
                }
lubomir@676
   419
                var qi = (ui / vd) | 0;
lubomir@676
   420
                q.setDigit(i, 0, qi);
lubomir@676
   421
                carry = ui - qi * vd;
lubomir@676
   422
            }
lubomir@676
   423
lubomir@676
   424
            r.hi32 = 0;
lubomir@676
   425
            r.lo32 = carry;
lubomir@676
   426
            return;
lubomir@676
   427
        }
lubomir@676
   428
lubomir@676
   429
        r.hi32 = u.hi32;  
lubomir@676
   430
        r.lo32 = u.lo32;
lubomir@676
   431
lubomir@676
   432
        if (m < n) {
lubomir@676
   433
            return;
lubomir@676
   434
        }
lubomir@676
   435
lubomir@676
   436
        // Normalize
lubomir@676
   437
        var nrm = __countLeadingZeroes16(v.getDigit(n - 1, 0));
lubomir@676
   438
lubomir@676
   439
        var vd1 = v.getDigit(n - 1, nrm);                
lubomir@676
   440
        var vd0 = v.getDigit(n - 2, nrm);
lubomir@676
   441
        for (var j = m - n; j >= 0; --j) {
lubomir@676
   442
            // Calculate qj estimate
lubomir@676
   443
            var ud21 = r.getTwoDigits(j + n, nrm);
lubomir@676
   444
            var ud2 = ud21 >>> 16;
lubomir@676
   445
            if (ud21 < 0) {
lubomir@676
   446
                ud21 += 0x100000000;
lubomir@676
   447
            }
lubomir@676
   448
lubomir@676
   449
            var qest = (ud2 === vd1) ? 0xFFFF : ((ud21 / vd1) | 0);
lubomir@676
   450
            var rest = ud21 - qest * vd1;
lubomir@676
   451
lubomir@676
   452
            // 0 <= (qest - qj) <= 2
lubomir@676
   453
lubomir@676
   454
            // Refine qj estimate
lubomir@676
   455
            var ud0 = r.getDigit(j + n - 2, nrm);
lubomir@676
   456
            while ((qest * vd0) > ((rest * 0x10000) + ud0)) {
lubomir@676
   457
                --qest;
lubomir@676
   458
                rest += vd1;
lubomir@676
   459
            }
lubomir@676
   460
lubomir@676
   461
            // 0 <= (qest - qj) <= 1
lubomir@676
   462
            
lubomir@676
   463
            // Multiply and subtract
lubomir@676
   464
            var carry = 0;
lubomir@676
   465
            for (var i = 0; i < n; ++i) {
lubomir@676
   466
                var vi = qest * v.getDigit(i, nrm);
lubomir@676
   467
                var ui = r.getDigit(i + j, nrm) - carry - (vi & 0xffff);
lubomir@676
   468
                r.setDigit(i + j, nrm, ui);
lubomir@676
   469
                carry = (vi >>> 16) - (ui >> 16);
lubomir@676
   470
            }
lubomir@676
   471
            var uj = ud2 - carry;
lubomir@676
   472
lubomir@676
   473
            if (uj < 0) {
lubomir@676
   474
                // qest - qj = 1
lubomir@676
   475
lubomir@676
   476
                // Add back
lubomir@676
   477
                --qest;
lubomir@676
   478
                var carry = 0;
lubomir@676
   479
                for (var i = 0; i < n; ++i) {
lubomir@676
   480
                    var ui = r.getDigit(i + j, nrm) + v.getDigit(i, nrm)
lubomir@676
   481
                                 + carry;
lubomir@676
   482
                    r.setDigit(i + j, nrm, ui);
lubomir@676
   483
                    carry = ui >> 16;
lubomir@676
   484
                }
lubomir@676
   485
                uj += carry;
lubomir@676
   486
            }
lubomir@676
   487
lubomir@676
   488
            q.setDigit(j, 0, qest);
lubomir@676
   489
            r.setDigit(j + n, nrm, uj);
lubomir@676
   490
        }
lubomir@676
   491
    }
lubomir@737
   492
lubomir@737
   493
    numberPrototype.div32 = function(x) {
lubomir@737
   494
        if (x === 0) {
lubomir@737
   495
            __handleDivByZero();
lubomir@737
   496
        }
lubomir@737
   497
lubomir@737
   498
        return (this / x) | 0;
lubomir@737
   499
    }
lubomir@737
   500
lubomir@737
   501
    numberPrototype.mod32 = function(x) {
lubomir@737
   502
        if (x === 0) {
lubomir@737
   503
            __handleDivByZero();
lubomir@737
   504
        }
lubomir@737
   505
lubomir@737
   506
        return (this % x);
lubomir@737
   507
    }
lubomir@737
   508
lubomir@676
   509
    numberPrototype.div64 = function(x) {
lubomir@676
   510
        var negateResult = false;
lubomir@676
   511
        var u, v;
lubomir@737
   512
lubomir@676
   513
        if ((this.high32() & 0x80000000) != 0) {
lubomir@676
   514
            u = this.neg64();
lubomir@676
   515
            negateResult = !negateResult;
lubomir@676
   516
        } else {
lubomir@676
   517
            u = this;        
lubomir@676
   518
        }
lubomir@676
   519
lubomir@676
   520
        if ((x.high32() & 0x80000000) != 0) {
lubomir@676
   521
            v = x.neg64();
lubomir@676
   522
            negateResult = !negateResult;
lubomir@676
   523
        } else {
lubomir@676
   524
            v = x;
lubomir@676
   525
        }
lubomir@676
   526
lubomir@778
   527
        if ((v == 0) && (v.high32() === 0)) {
lubomir@737
   528
            __handleDivByZero();
lubomir@676
   529
        }
lubomir@676
   530
lubomir@676
   531
        if (u.high32() === 0) {
lubomir@676
   532
            if (v.high32() === 0) {
lubomir@676
   533
                var result = (u / v) | 0;
lubomir@676
   534
                return negateResult ? result.neg64() : result; 
lubomir@676
   535
            }
lubomir@676
   536
lubomir@676
   537
            return 0;
lubomir@676
   538
        }
lubomir@676
   539
lubomir@676
   540
        var u64 = new __Int64(u.high32(), u);
lubomir@676
   541
        var v64 = new __Int64(v.high32(), v);
lubomir@676
   542
        var q64 = new __Int64(0, 0);
lubomir@676
   543
        var r64 = new __Int64(0, 0);
lubomir@676
   544
lubomir@676
   545
        __div64(q64, r64, u64, v64);
lubomir@676
   546
lubomir@676
   547
        var result = q64.toNumber();
lubomir@676
   548
        return negateResult ? result.neg64() : result; 
lubomir@676
   549
    }
lubomir@676
   550
lubomir@676
   551
    numberPrototype.mod64 = function(x) {
lubomir@676
   552
        var negateResult = false;
lubomir@676
   553
        var u, v;
lubomir@676
   554
        
lubomir@676
   555
        if ((this.high32() & 0x80000000) != 0) {
lubomir@676
   556
            u = this.neg64();
lubomir@676
   557
            negateResult = !negateResult;
lubomir@676
   558
        } else {
lubomir@676
   559
            u = this;        
lubomir@676
   560
        }
lubomir@676
   561
lubomir@676
   562
        if ((x.high32() & 0x80000000) != 0) {
lubomir@676
   563
            v = x.neg64();
lubomir@676
   564
        } else {
lubomir@676
   565
            v = x;
lubomir@676
   566
        }
lubomir@676
   567
lubomir@778
   568
        if ((v == 0) && (v.high32() === 0)) {
lubomir@737
   569
            __handleDivByZero();
lubomir@676
   570
        }
lubomir@676
   571
lubomir@676
   572
        if (u.high32() === 0) {
lubomir@676
   573
            var result = (v.high32() === 0) ? (u % v) : u;
lubomir@676
   574
            return negateResult ? result.neg64() : result; 
lubomir@676
   575
        }
lubomir@676
   576
lubomir@676
   577
        var u64 = new __Int64(u.high32(), u);
lubomir@676
   578
        var v64 = new __Int64(v.high32(), v);
lubomir@676
   579
        var q64 = new __Int64(0, 0);
lubomir@676
   580
        var r64 = new __Int64(0, 0);
lubomir@676
   581
lubomir@676
   582
        __div64(q64, r64, u64, v64);
lubomir@676
   583
lubomir@676
   584
        var result = r64.toNumber();
lubomir@676
   585
        return negateResult ? result.neg64() : result; 
lubomir@676
   586
    }
lubomir@678
   587
})(Number.prototype);
jaroslav@832
   588
jaroslav@832
   589
vm.java_lang_Number(false);