emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js
brancharithmetic
changeset 657 b42bfe334128
parent 630 04e312a7887e
child 669 3754580b6c67
     1.1 --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Fri Feb 01 09:00:30 2013 +0100
     1.2 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Mon Feb 04 09:41:33 2013 +0100
     1.3 @@ -80,6 +80,32 @@
     1.4      return hi.next32(low);
     1.5  };
     1.6  
     1.7 +Number.prototype.mul64 = function(x) {
     1.8 +    var low = this.mul32(x);
     1.9 +    low += (low < 0) ? (__m32+1) : 0;
    1.10 +    // first count upper 32 bits of (this.low * x.low)
    1.11 +    var hi_hi = 0;
    1.12 +    var hi_low = 0;
    1.13 +    var m = 1;
    1.14 +    for (var i = 0; i < 32; i++) {
    1.15 +        if (x & m) {
    1.16 +            hi_hi += this >>> 16;
    1.17 +            hi_low += this & 0xFFFF
    1.18 +        }
    1.19 +        hi_low >>= 1;
    1.20 +        hi_low += (hi_hi & 1) ? 0x8000 : 0;
    1.21 +        hi_hi >>= 1;
    1.22 +        m <<= 1;
    1.23 +    }
    1.24 +    var hi = (hi_hi << 16) + hi_low;
    1.25 +    
    1.26 +    var m1 = this.high32().mul32(x);
    1.27 +    var m2 = this.mul32(x.high32());
    1.28 +    hi = hi.add32(m1).add32(m2);
    1.29 +    
    1.30 +    return hi.next32(low);
    1.31 +};
    1.32 +
    1.33  Number.prototype.div64 = function(x) {
    1.34      var low = Math.floor(this.toFP() / x.toFP()); // TODO: not exact enough
    1.35      if (low > __m32) {