Encapsulating access to lower 32-bits of a long number
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 27 Jan 2016 22:46:04 +0100
changeset 18739af63c578721
parent 1872 df5db062f180
child 1874 0ba84325bac7
Encapsulating access to lower 32-bits of a long number
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 21:37:10 2016 +0100
     1.2 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Wed Jan 27 22:46:04 2016 +0100
     1.3 @@ -21,20 +21,23 @@
     1.4      numberPrototype.high32 = function() {
     1.5          return high32(this);
     1.6      };
     1.7 +    function low32(x) {
     1.8 +        return x.lo ? x.lo : x;
     1.9 +    };
    1.10      function high32(x) {
    1.11 -        return x.hi ? x.hi : (Math.floor(x / (__m32 + 1))) | 0;
    1.12 +        return x.hi ? x.hi : (Math.floor(low32(x) / (__m32 + 1))) | 0;
    1.13      };
    1.14      numberPrototype.toFP = function() {
    1.15 -        return this.hi ? this.hi * (__m32 + 1) + this : this;
    1.16 +        return this.hi ? this.hi * (__m32 + 1) + low32(this) : low32(this);
    1.17      };
    1.18      numberPrototype.toLong = function() {
    1.19 -        var hi = (this / (__m32 + 1)) | 0;
    1.20 -        var low = (this % (__m32 + 1)) | 0;
    1.21 +        var hi = (low32(this) / (__m32 + 1)) | 0;
    1.22 +        var low = (low32(this) % (__m32 + 1)) | 0;
    1.23          if (low < 0) {
    1.24              low += __m32 + 1;
    1.25          }
    1.26  
    1.27 -        if (this < 0) {
    1.28 +        if (low32(this) < 0) {
    1.29              hi -= 1;
    1.30          }
    1.31  
    1.32 @@ -44,7 +47,7 @@
    1.33      numberPrototype.toExactString = function() {
    1.34          if (this.hi) {
    1.35              // check for Long.MIN_VALUE
    1.36 -            if ((this.hi == (0x80000000 | 0)) && (this == 0)) {
    1.37 +            if ((this.hi == (0x80000000 | 0)) && (low32(this) == 0)) {
    1.38                  return '-9223372036854775808';
    1.39              }
    1.40              var res = 0;
    1.41 @@ -55,10 +58,10 @@
    1.42              if (neg) {
    1.43                  var x = neg64(this);
    1.44                  var hi = x.hi;
    1.45 -                var low = x;
    1.46 +                var low = low32(x);
    1.47              } else {
    1.48                  var hi = this.hi;
    1.49 -                var low = this;
    1.50 +                var low = low32(this);
    1.51              }
    1.52              for (var i = 0; i < a.length; i++) {
    1.53                  res += hi * a[i];
    1.54 @@ -77,11 +80,11 @@
    1.55              s = String(res).concat(s).replace(/^0+/, '');
    1.56              return (neg ? '-' : '').concat(s);
    1.57          }
    1.58 -        return String(this);
    1.59 +        return String(low32(this));
    1.60      };
    1.61  
    1.62      function add64(x, y) {
    1.63 -        var low = x + y;
    1.64 +        var low = low32(x) + low32(y);
    1.65          carry = 0;
    1.66          if (low > __m32) {
    1.67              carry = 1;
    1.68 @@ -92,7 +95,7 @@
    1.69      };
    1.70  
    1.71      function sub64(x, y) {
    1.72 -        var low = x - y;
    1.73 +        var low = low32(x) - low32(y);
    1.74          carry = 0;
    1.75          if (low < 0) {
    1.76              carry = 1;
    1.77 @@ -103,14 +106,14 @@
    1.78      };
    1.79  
    1.80      function mul64(x, y) {
    1.81 -        var low = mul32(x, y);
    1.82 +        var low = mul32(low32(x), low32(y));
    1.83          low += (low < 0) ? (__m32 + 1) : 0;
    1.84          // first count upper 32 bits of (x.low * x.low)
    1.85          var hi_hi = 0;
    1.86          var hi_low = 0;
    1.87          var m = 1;
    1.88          for (var i = 0; i < 32; i++) {
    1.89 -            if (y & m) {
    1.90 +            if (low32(y) & m) {
    1.91                  hi_hi += x >>> 16;
    1.92                  hi_low += x & 0xFFFF
    1.93              }
    1.94 @@ -121,15 +124,15 @@
    1.95          }
    1.96          var hi = (hi_hi << 16) + hi_low;
    1.97  
    1.98 -        var m1 = mul32(high32(x), y);
    1.99 -        var m2 = mul32(x, high32(y));
   1.100 +        var m1 = mul32(high32(x), low32(y));
   1.101 +        var m2 = mul32(low32(x), high32(y));
   1.102          hi = add32(add32(hi, m1), m2);
   1.103  
   1.104          return hi.next32(low);
   1.105      };
   1.106  
   1.107      function and64(x, y) {
   1.108 -        var low = x & y;
   1.109 +        var low = low32(x) & low32(y);
   1.110          low += (low < 0) ? (__m32 + 1) : 0;
   1.111          if (x.hi && y.hi) {
   1.112              var hi = x.hi & y.hi;
   1.113 @@ -140,7 +143,7 @@
   1.114      };
   1.115  
   1.116      function or64(x, y) {
   1.117 -        var low = x | y;
   1.118 +        var low = low32(x) | low32(y);
   1.119          low += (low < 0) ? (__m32 + 1) : 0;
   1.120          if (x.hi || y.hi) {
   1.121              var hi = x.hi | y.hi;
   1.122 @@ -150,7 +153,7 @@
   1.123      };
   1.124  
   1.125      function xor64(x, y) {
   1.126 -        var low = x ^ y;
   1.127 +        var low = low32(x) ^ low32(y);
   1.128          low += (low < 0) ? (__m32 + 1) : 0;
   1.129          if (x.hi || y.hi) {
   1.130              var hi = x.hi ^ y.hi;
   1.131 @@ -164,13 +167,13 @@
   1.132          x &= 0x3f;
   1.133          if (x === 0) return thiz;
   1.134          if (x >= 32) {
   1.135 -            var hi = thiz << (x - 32);
   1.136 +            var hi = low32(thiz) << (x - 32);
   1.137              return hi.next32(0);
   1.138          } else {
   1.139              var hi = high32(thiz) << x;
   1.140 -            var low_reminder = thiz >> (32 - x);
   1.141 +            var low_reminder = low32(thiz) >> (32 - x);
   1.142              hi |= low_reminder;
   1.143 -            var low = thiz << x;
   1.144 +            var low = low32(thiz) << x;
   1.145              low += (low < 0) ? (__m32 + 1) : 0;
   1.146              return hi.next32(low);
   1.147          }
   1.148 @@ -184,7 +187,7 @@
   1.149              low += (low < 0) ? (__m32 + 1) : 0;
   1.150              return low;
   1.151          } else {
   1.152 -            var low = thiz >>> x;
   1.153 +            var low = low32(thiz) >>> x;
   1.154              var hi_reminder = high32(thiz) << (32 - x);
   1.155              low |= hi_reminder;
   1.156              low += (low < 0) ? (__m32 + 1) : 0;
   1.157 @@ -201,7 +204,7 @@
   1.158              low += (low < 0) ? (__m32 + 1) : 0;
   1.159              return low;
   1.160          } else {
   1.161 -            var low = thiz >>> x;
   1.162 +            var low = low32(thiz) >>> x;
   1.163              var hi_reminder = high32(thiz) << (32 - x);
   1.164              low |= hi_reminder;
   1.165              low += (low < 0) ? (__m32 + 1) : 0;
   1.166 @@ -212,14 +215,16 @@
   1.167  
   1.168      function compare64(x, y) {
   1.169          if (high32(x) === high32(y)) {
   1.170 -            return (x < y) ? -1 : ((x > y) ? 1 : 0);
   1.171 +            var lox = low32(x);
   1.172 +            var loy = low32(y);
   1.173 +            return (lox < loy) ? -1 : ((lox > loy) ? 1 : 0);
   1.174          }
   1.175          return (high32(x) < high32(y)) ? -1 : 1;
   1.176      };
   1.177  
   1.178      function neg64(x) {
   1.179          var hi = high32(x);
   1.180 -        var low = x;
   1.181 +        var low = low32(x);
   1.182          if ((hi === 0) && (low < 0)) {
   1.183              return -low;
   1.184          }
   1.185 @@ -483,21 +488,21 @@
   1.186              v = y;
   1.187          }
   1.188  
   1.189 -        if ((v === 0) && (high32(v) === 0)) {
   1.190 +        if ((low32(v) === 0) && (high32(v) === 0)) {
   1.191              __handleDivByZero();
   1.192          }
   1.193  
   1.194          if (high32(u) === 0) {
   1.195              if (high32(v) === 0) {
   1.196 -                var result = (u / v) | 0;
   1.197 +                var result = (low32(u) / low32(v)) | 0;
   1.198                  return negateResult ? neg64(result) : result;
   1.199              }
   1.200  
   1.201              return 0;
   1.202          }
   1.203  
   1.204 -        var u64 = new __Int64(high32(u), u);
   1.205 -        var v64 = new __Int64(high32(v), v);
   1.206 +        var u64 = new __Int64(high32(u), low32(u));
   1.207 +        var v64 = new __Int64(high32(v), low32(v));
   1.208          var q64 = new __Int64(0, 0);
   1.209          var r64 = new __Int64(0, 0);
   1.210  
   1.211 @@ -524,17 +529,17 @@
   1.212              v = y;
   1.213          }
   1.214  
   1.215 -        if ((v === 0) && (high32(v) === 0)) {
   1.216 +        if ((low32(v) === 0) && (high32(v) === 0)) {
   1.217              __handleDivByZero();
   1.218          }
   1.219  
   1.220          if (high32(u) === 0) {
   1.221 -            var result = (high32(v) === 0) ? (u % v) : u;
   1.222 +            var result = (high32(v) === 0) ? (low32(u) % low32(v)) : low32(u);
   1.223              return negateResult ? neg64(result) : result;
   1.224          }
   1.225  
   1.226 -        var u64 = new __Int64(high32(u), u);
   1.227 -        var v64 = new __Int64(high32(v), v);
   1.228 +        var u64 = new __Int64(high32(u), low32(u));
   1.229 +        var v64 = new __Int64(high32(v), low32(v));
   1.230          var q64 = new __Int64(0, 0);
   1.231          var r64 = new __Int64(0, 0);
   1.232