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