Providing direct resolution for add64, sub64, mul64, div64 functions
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 27 Jan 2016 20:30:33 +0100
changeset 186760e77363650a
parent 1866 5447274f0321
child 1868 cb3c8fb1245d
Providing direct resolution for add64, sub64, mul64, div64 functions
rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js
     1.1 --- a/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Wed Jan 27 06:46:03 2016 +0100
     1.2 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Wed Jan 27 20:30:33 2016 +0100
     1.3 @@ -77,39 +77,39 @@
     1.4          return String(this);
     1.5      };
     1.6  
     1.7 -    numberPrototype.add64 = function(x) {
     1.8 -        var low = this + x;
     1.9 +    function add64(x, y) {
    1.10 +        var low = x + y;
    1.11          carry = 0;
    1.12          if (low > __m32) {
    1.13              carry = 1;
    1.14              low -= (__m32 + 1);
    1.15          }
    1.16 -        var hi = (this.high32() + x.high32() + carry) | 0;
    1.17 +        var hi = (x.high32() + y.high32() + carry) | 0;
    1.18          return hi.next32(low);
    1.19      };
    1.20  
    1.21 -    numberPrototype.sub64 = function(x) {
    1.22 -        var low = this - x;
    1.23 +    function sub64(x, y) {
    1.24 +        var low = x - y;
    1.25          carry = 0;
    1.26          if (low < 0) {
    1.27              carry = 1;
    1.28              low += (__m32 + 1);
    1.29          }
    1.30 -        var hi = (this.high32() - x.high32() - carry) | 0;
    1.31 +        var hi = (x.high32() - y.high32() - carry) | 0;
    1.32          return hi.next32(low);
    1.33      };
    1.34  
    1.35 -    numberPrototype.mul64 = function(x) {
    1.36 -        var low = mul32(this, x);
    1.37 +    function mul64(x, y) {
    1.38 +        var low = mul32(x, y);
    1.39          low += (low < 0) ? (__m32 + 1) : 0;
    1.40 -        // first count upper 32 bits of (this.low * x.low)
    1.41 +        // first count upper 32 bits of (x.low * x.low)
    1.42          var hi_hi = 0;
    1.43          var hi_low = 0;
    1.44          var m = 1;
    1.45          for (var i = 0; i < 32; i++) {
    1.46 -            if (x & m) {
    1.47 -                hi_hi += this >>> 16;
    1.48 -                hi_low += this & 0xFFFF
    1.49 +            if (y & m) {
    1.50 +                hi_hi += x >>> 16;
    1.51 +                hi_low += x & 0xFFFF
    1.52              }
    1.53              hi_low >>= 1;
    1.54              hi_low += (hi_hi & 1) ? 0x8000 : 0;
    1.55 @@ -118,8 +118,8 @@
    1.56          }
    1.57          var hi = (hi_hi << 16) + hi_low;
    1.58  
    1.59 -        var m1 = mul32(this.high32(), x);
    1.60 -        var m2 = mul32(this, x.high32());
    1.61 +        var m1 = mul32(x.high32(), y);
    1.62 +        var m2 = mul32(x, y.high32());
    1.63          hi = add32(add32(hi, m1), m2);
    1.64  
    1.65          return hi.next32(low);
    1.66 @@ -225,7 +225,7 @@
    1.67          low = ~low;
    1.68          low += (low < 0) ? (__m32 + 1) : 0;
    1.69          var ret = hi.next32(low);
    1.70 -        return ret.add64(1);
    1.71 +        return add64(ret, 1);
    1.72      };
    1.73      
    1.74      function __handleDivByZero() {
    1.75 @@ -463,25 +463,25 @@
    1.76          }
    1.77      }
    1.78  
    1.79 -    numberPrototype.div64 = function(x) {
    1.80 +    function div64(x, y) {
    1.81          var negateResult = false;
    1.82          var u, v;
    1.83  
    1.84 -        if ((this.high32() & 0x80000000) != 0) {
    1.85 -            u = this.neg64();
    1.86 +        if ((x.high32() & 0x80000000) !== 0) {
    1.87 +            u = x.neg64();
    1.88              negateResult = !negateResult;
    1.89          } else {
    1.90 -            u = this;        
    1.91 +            u = x;
    1.92          }
    1.93  
    1.94 -        if ((x.high32() & 0x80000000) != 0) {
    1.95 -            v = x.neg64();
    1.96 +        if ((y.high32() & 0x80000000) !== 0) {
    1.97 +            v = y.neg64();
    1.98              negateResult = !negateResult;
    1.99          } else {
   1.100 -            v = x;
   1.101 +            v = y;
   1.102          }
   1.103  
   1.104 -        if ((v == 0) && (v.high32() === 0)) {
   1.105 +        if ((v === 0) && (v.high32() === 0)) {
   1.106              __handleDivByZero();
   1.107          }
   1.108  
   1.109 @@ -543,10 +543,10 @@
   1.110      }
   1.111  
   1.112      var b = numberPrototype['__bit64'] = {};
   1.113 -    b.add64 = function(x,y) { return x.add64(y); };
   1.114 -    b.sub64 = function(x,y) { return x.sub64(y); };
   1.115 -    b.mul64 = function(x,y) { return x.mul64(y); };
   1.116 -    b.div64 = function(x,y) { return x.div64(y); };
   1.117 +    b.add64 = add64;
   1.118 +    b.sub64 = sub64;
   1.119 +    b.mul64 = mul64;
   1.120 +    b.div64 = div64;
   1.121      b.mod64 = function(x,y) { return x.mod64(y); };
   1.122      b.and64 = function(x,y) { return x.and64(y); };
   1.123      b.or64 = function(x,y) { return x.or64(y); };