Long operator >>> and tests arithmetic
authorMartin Soch <Martin.Soch@oracle.com>
Fri, 01 Feb 2013 06:09:18 +0100
brancharithmetic
changeset 6292d537f8cd604
parent 628 e606853325f1
child 630 04e312a7887e
Long operator >>> and tests
emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java
vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java
     1.1 --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Thu Jan 31 20:37:12 2013 +0100
     1.2 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Fri Feb 01 06:09:18 2013 +0100
     1.3 @@ -121,10 +121,10 @@
     1.4  
     1.5  Number.prototype.shl64 = function(x) {
     1.6      if (x >= 32) {
     1.7 -        var hi = (this << (x - 32)) | 0;
     1.8 +        var hi = this << (x - 32);
     1.9          return hi.next32(0);
    1.10      } else {
    1.11 -        var hi = (this.high32() << x) | 0;
    1.12 +        var hi = this.high32() << x;
    1.13          var low_reminder = this >> (32 - x);
    1.14          hi |= low_reminder;
    1.15          var low = this << x;
    1.16 @@ -135,11 +135,11 @@
    1.17  
    1.18  Number.prototype.shr64 = function(x) {
    1.19      if (x >= 32) {
    1.20 -        var low = (this.high32() >> (x - 32)) | 0;
    1.21 +        var low = this.high32() >> (x - 32);
    1.22          low += (low < 0) ? (__m32+1) : 0;
    1.23          return low;
    1.24      } else {
    1.25 -        var low = (this >> x) | 0;
    1.26 +        var low = this >> x;
    1.27          var hi_reminder = this.high32() << (32 - x);
    1.28          low |= hi_reminder;
    1.29          low += (low < 0) ? (__m32+1) : 0;
    1.30 @@ -148,6 +148,21 @@
    1.31      }
    1.32  };
    1.33  
    1.34 +Number.prototype.ushr64 = function(x) {
    1.35 +    if (x >= 32) {
    1.36 +        var low = this.high32() >>> (x - 32);
    1.37 +        low += (low < 0) ? (__m32+1) : 0;
    1.38 +        return low;
    1.39 +    } else {
    1.40 +        var low = this >>> x;
    1.41 +        var hi_reminder = this.high32() << (32 - x);
    1.42 +        low |= hi_reminder;
    1.43 +        low += (low < 0) ? (__m32+1) : 0;
    1.44 +        var hi = this.high32() >>> x;
    1.45 +        return hi.next32(low);
    1.46 +    }
    1.47 +};
    1.48 +
    1.49  Number.prototype.compare64 = function(x) {
    1.50      if (this.hi == x.hi) {
    1.51          return (this == x) ? 0 : ((this < x) ? -1 : 1);
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Jan 31 20:37:12 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Feb 01 06:09:18 2013 +0100
     2.3 @@ -624,7 +624,7 @@
     2.4                      emit(out, "@1 >>>= @2;", smapper.getI(1), smapper.popI());
     2.5                      break;
     2.6                  case opc_lushr:
     2.7 -                    emit(out, "@1 >>>= @2;", smapper.getL(1), smapper.popI());
     2.8 +                    emit(out, "@1 = @1.ushr64(@2);", smapper.getL(1), smapper.popI());
     2.9                      break;
    2.10                  case opc_iinc: {
    2.11                      ++i;
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Thu Jan 31 20:37:12 2013 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Fri Feb 01 06:09:18 2013 +0100
     3.3 @@ -255,6 +255,42 @@
     3.4                  45);
     3.5      }
     3.6      
     3.7 +    @Test public void longUShiftR1() throws Exception {
     3.8 +        final long res = 0x00fa37d7763e0ca1l >>> 5;
     3.9 +        assertExec("Long >>> 5",
    3.10 +            Numbers.class, "ushrL__J_3BI", 
    3.11 +            Double.valueOf(res),
    3.12 +                new byte[] { (byte)0x00, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 },
    3.13 +                5);
    3.14 +    }
    3.15 +    
    3.16 +    @Test public void longUShiftR2() throws Exception {
    3.17 +        final long res = 0x00fa37d7763e0ca1l >>> 45;
    3.18 +        assertExec("Long >>> 45",
    3.19 +            Numbers.class, "ushrL__J_3BI", 
    3.20 +            Double.valueOf(res),
    3.21 +                new byte[] { (byte)0x00, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 },
    3.22 +                45);
    3.23 +    }
    3.24 +    
    3.25 +    @Test public void longUShiftR3() throws Exception {
    3.26 +        final long res = 0xf0fa37d7763e0ca1l >>> 5;
    3.27 +        assertExec("Long >>> 5",
    3.28 +            Numbers.class, "ushrL__J_3BI", 
    3.29 +            Double.valueOf(res),
    3.30 +                new byte[] { (byte)0xf0, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 },
    3.31 +                5);
    3.32 +    }
    3.33 +    
    3.34 +    @Test public void longUShiftR4() throws Exception {
    3.35 +        final long res = 0xf0fa37d7763e0ca1l >>> 45;
    3.36 +        assertExec("Long >>> 45",
    3.37 +            Numbers.class, "ushrL__J_3BI", 
    3.38 +            Double.valueOf(res),
    3.39 +                new byte[] { (byte)0xf0, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 },
    3.40 +                45);
    3.41 +    }
    3.42 +    
    3.43      @Test public void longAnd() throws Exception {
    3.44          final long res = 0x00fa37d7763e0ca1l & 0xa7b3432fff00123el;
    3.45          assertExec("LOng binary AND",
     4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java	Thu Jan 31 20:37:12 2013 +0100
     4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java	Fri Feb 01 06:09:18 2013 +0100
     4.3 @@ -112,6 +112,12 @@
     4.4          return (disValue.readLong() >> nBits);
     4.5      }
     4.6      
     4.7 +    public static long ushrL(byte[] arrValue, int nBits) throws IOException {
     4.8 +        ByteArrayInputStream isValue = new ByteArrayInputStream(arrValue);
     4.9 +        DataInputStream disValue = new DataInputStream(isValue);
    4.10 +        return (disValue.readLong() >>> nBits);
    4.11 +    }
    4.12 +    
    4.13      public static long andL(byte[] arrX, byte[] arrY) throws IOException {
    4.14          ByteArrayInputStream isX = new ByteArrayInputStream(arrX);
    4.15          DataInputStream disX = new DataInputStream(isX);