Support for Long unary "-" arithmetic
authorMartin Soch <Martin.Soch@oracle.com>
Fri, 01 Feb 2013 09:00:30 +0100
brancharithmetic
changeset 63004e312a7887e
parent 629 2d537f8cd604
child 657 b42bfe334128
Support for Long unary "-"
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	Fri Feb 01 06:09:18 2013 +0100
     1.2 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Fri Feb 01 09:00:30 2013 +0100
     1.3 @@ -169,3 +169,13 @@
     1.4      }
     1.5      return (this.hi < x.hi) ? -1 : 1;
     1.6  };
     1.7 +
     1.8 +Number.prototype.neg64 = function() {
     1.9 +    var hi = this.high32();
    1.10 +    var low = this;
    1.11 +    if ((hi === 0) && (low < 0)) { return -low; }
    1.12 +    hi = ~hi;
    1.13 +    low = ~low;
    1.14 +    low += (low < 0) ? (__m32+1) : 0;
    1.15 +    return hi.next32(low);
    1.16 +};
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Feb 01 06:09:18 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Feb 01 09:00:30 2013 +0100
     2.3 @@ -600,7 +600,7 @@
     2.4                      emit(out, "@1 = -@1;", smapper.getI(0));
     2.5                      break;
     2.6                  case opc_lneg:
     2.7 -                    emit(out, "@1 = -@1;", smapper.getL(0));
     2.8 +                    emit(out, "@1 = @1.neg64();", smapper.getL(0));
     2.9                      break;
    2.10                  case opc_fneg:
    2.11                      emit(out, "@1 = -@1;", smapper.getF(0));
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Fri Feb 01 06:09:18 2013 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Fri Feb 01 09:00:30 2013 +0100
     3.3 @@ -151,6 +151,24 @@
     3.4          );
     3.5      }
     3.6      
     3.7 +    @Test public void longNegate1() throws Exception {
     3.8 +        final long res = -0x00fa37d7763e0ca1l;
     3.9 +        assertExec("Long negate",
    3.10 +            Numbers.class, "negL__J_3B", 
    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 +        );
    3.14 +    }
    3.15 +    
    3.16 +    @Test public void longNegate2() throws Exception {
    3.17 +        final long res = -0x80fa37d7763e0ca1l;
    3.18 +        assertExec("Long negate",
    3.19 +            Numbers.class, "negL__J_3B", 
    3.20 +            Double.valueOf(res),
    3.21 +                new byte[] { (byte)0x80, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 }
    3.22 +        );
    3.23 +    }
    3.24 +    
    3.25      @Test public void longAddOverflow() throws Exception {
    3.26          final long res = Long.MAX_VALUE + 1l;
    3.27          assertExec("Addition 1+MAX",
     4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java	Fri Feb 01 06:09:18 2013 +0100
     4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java	Fri Feb 01 09:00:30 2013 +0100
     4.3 @@ -72,6 +72,12 @@
     4.4          return Long.MAX_VALUE;
     4.5      }
     4.6      
     4.7 +    public static long negL(byte[] arrValue) throws IOException {
     4.8 +        ByteArrayInputStream isValue = new ByteArrayInputStream(arrValue);
     4.9 +        DataInputStream disValue = new DataInputStream(isValue);
    4.10 +        return (-disValue.readLong());
    4.11 +    }
    4.12 +    
    4.13      public static long addL(byte[] arrX, byte[] arrY) throws IOException {
    4.14          ByteArrayInputStream isX = new ByteArrayInputStream(arrX);
    4.15          DataInputStream disX = new DataInputStream(isX);