emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js
author Martin Soch <Martin.Soch@oracle.com>
Thu, 31 Jan 2013 15:26:09 +0100
brancharithmetic
changeset 620 189f695d0b02
parent 619 5134b1d78432
child 627 4c2b92281cdc
permissions -rw-r--r--
Added subtraction for Long + tests
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@439
     7
Martin@445
     8
Number.prototype.toInt8 = function()  { return (this << 24) >> 24; };
Martin@582
     9
Number.prototype.toInt16 = function() { return (this << 16) >> 16; };
Martin@582
    10
Martin@615
    11
var __m32 = 0xFFFFFFFF;
Martin@615
    12
Martin@594
    13
Number.prototype.next32 = function(low) {
Martin@594
    14
  if (this === 0) {
Martin@594
    15
    return low;
Martin@594
    16
  }
Martin@594
    17
  var l = new Number(low);
Martin@616
    18
  l.hi = this | 0;
Martin@594
    19
  return l;
Martin@582
    20
};
Martin@582
    21
Martin@594
    22
Number.prototype.high32 = function() { 
Martin@615
    23
    return this.hi ? this.hi : (Math.floor(this / (__m32+1))) | 0;
Martin@594
    24
};
Martin@594
    25
Number.prototype.toInt32 = function() { return this | 0; };
Martin@594
    26
Number.prototype.toFP = function() {
Martin@615
    27
    return this.hi ? this.hi * (__m32+1) + this : this;
Martin@594
    28
};
Martin@594
    29
Number.prototype.toLong = function() {
Martin@615
    30
    var hi = (this > __m32) ? (Math.floor(this / (__m32+1))) | 0 : 0;
Martin@616
    31
    return hi.next32(Math.floor(this % (__m32+1)));
Martin@607
    32
};
Martin@607
    33
Martin@607
    34
Number.prototype.toExactString = function() {
Martin@607
    35
    if (this.hi) {
Martin@607
    36
        var res = 0;
Martin@607
    37
        var a = [ 6,9,2,7,6,9,4,9,2,4 ];
Martin@607
    38
        var s = '';
Martin@607
    39
        var digit;
Martin@607
    40
        var hi = this.hi;
Martin@607
    41
        var low = this;
Martin@607
    42
        for (var i = 0; i < a.length; i++) {
Martin@607
    43
            res += hi * a[i];
Martin@607
    44
            var low_digit = low % 10;
Martin@607
    45
            digit = (res % 10) + low_digit;
Martin@607
    46
Martin@607
    47
            low = Math.floor(low / 10);
Martin@607
    48
            res = Math.floor(res / 10);
Martin@607
    49
Martin@607
    50
            if (digit >= 10) {
Martin@607
    51
                digit -= 10;
Martin@607
    52
                res++;
Martin@607
    53
            }
Martin@607
    54
            s = String(digit).concat(s);
Martin@607
    55
        }
Martin@607
    56
        return String(res).concat(s);
Martin@607
    57
    }
Martin@607
    58
    return String(this);
Martin@607
    59
};
Martin@594
    60
Martin@594
    61
Number.prototype.add64 = function(x) {
Martin@594
    62
    var low = this + x;
Martin@594
    63
    carry = 0;
Martin@615
    64
    if (low > __m32) {
Martin@594
    65
        carry = 1;
Martin@615
    66
        low -= (__m32+1);
Martin@594
    67
    }
Martin@615
    68
    var hi = (this.high32() + x.high32() + carry) | 0;
Martin@594
    69
    return hi.next32(low);
Martin@582
    70
};
Martin@582
    71
Martin@620
    72
Number.prototype.sub64 = function(x) {
Martin@620
    73
    var low = this - x;
Martin@620
    74
    carry = 0;
Martin@620
    75
    if (low < 0) {
Martin@620
    76
        carry = 1;
Martin@620
    77
        low += (__m32+1);
Martin@620
    78
    }
Martin@620
    79
    var hi = (this.high32() - x.high32() - carry) | 0;
Martin@620
    80
    return hi.next32(low);
Martin@620
    81
};
Martin@620
    82
Martin@594
    83
Number.prototype.div64 = function(x) {
Martin@594
    84
    var low = Math.floor(this.toFP() / x.toFP()); // TODO: not exact enough
Martin@615
    85
    if (low > __m32) {
Martin@615
    86
        var hi = Math.floor(low / (__m32+1)) | 0;
Martin@615
    87
        return hi.next32(low % (__m32+1));
Martin@582
    88
    }
Martin@594
    89
    return low;
Martin@582
    90
};
Martin@582
    91
Martin@615
    92
Number.prototype.and64 = function(x) {
Martin@615
    93
    var low = this & x;
Martin@615
    94
    if (this.hi && x.hi) {
Martin@615
    95
        var hi = this.hi & x.hi;
Martin@615
    96
        return hi.next32(low);
Martin@615
    97
    };
Martin@615
    98
    return low;
Martin@615
    99
};
Martin@615
   100
Martin@594
   101
Number.prototype.shl64 = function(x) {
Martin@616
   102
    if (x >= 32) {
Martin@616
   103
        var hi = (this << (x - 32)) | 0;
Martin@594
   104
        return hi.next32(0);
Martin@594
   105
    } else {
Martin@616
   106
        var hi = (this.high32() << x) | 0;
Martin@615
   107
        var low_reminder = this >> (32 - x);
Martin@594
   108
        hi |= low_reminder;
Martin@594
   109
        var low = this << x;
Martin@616
   110
        low += (low < 0) ? (__m32+1) : 0;
Martin@594
   111
        return hi.next32(low);
Martin@594
   112
    }
Martin@582
   113
};
Martin@582
   114
Martin@615
   115
Number.prototype.shr64 = function(x) {
Martin@619
   116
    if (x >= 32) {
Martin@619
   117
        var low = (this.high32() >> (x - 32)) | 0;
Martin@619
   118
        low += (low < 0) ? (__m32+1) : 0;
Martin@615
   119
        return low;
Martin@615
   120
    } else {
Martin@619
   121
        var low = (this >> x) | 0;
Martin@619
   122
        var hi_reminder = this.high32() << (32 - x);
Martin@615
   123
        low |= hi_reminder;
Martin@619
   124
        low += (low < 0) ? (__m32+1) : 0;
Martin@615
   125
        var hi = this.high32() >> x;
Martin@615
   126
        return hi.next32(low);
Martin@615
   127
    }
Martin@615
   128
};
Martin@615
   129
Martin@594
   130
Number.prototype.compare64 = function(x) {
Martin@582
   131
    if (this.hi == x.hi) {
Martin@594
   132
        return (this == x) ? 0 : ((this < x) ? -1 : 1);
Martin@582
   133
    }
Martin@582
   134
    return (this.hi < x.hi) ? -1 : 1;
Martin@582
   135
};