Fixed negation for Integer.MIN_VALUE arithmetic
authorMartin Soch <Martin.Soch@oracle.com>
Thu, 07 Feb 2013 17:41:41 +0100
brancharithmetic
changeset 700b9bf26ea0118
parent 699 6cad41d877d2
child 703 5c349e067fa8
child 734 80833f6829e6
Fixed negation for Integer.MIN_VALUE
emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vmtest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java
     1.1 --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Thu Feb 07 17:24:19 2013 +0100
     1.2 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js	Thu Feb 07 17:41:41 2013 +0100
     1.3 @@ -4,6 +4,7 @@
     1.4  Number.prototype.mul32 = function(x) { 
     1.5      return (((this * (x >> 16)) << 16) + this * (x & 0xFFFF)) | 0;
     1.6  };
     1.7 +Number.prototype.neg32 = function() { return (-this) | 0; };
     1.8  
     1.9  Number.prototype.toInt8 = function()  { return (this << 24) >> 24; };
    1.10  Number.prototype.toInt16 = function() { return (this << 16) >> 16; };
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Feb 07 17:24:19 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Feb 07 17:41:41 2013 +0100
     2.3 @@ -598,7 +598,7 @@
     2.4                      emit(out, "@1 = @1.xor64(@2);", smapper.getL(1), smapper.popL());
     2.5                      break;
     2.6                  case opc_ineg:
     2.7 -                    emit(out, "@1 = -@1;", smapper.getI(0));
     2.8 +                    emit(out, "@1 = @1.neg32();", smapper.getI(0));
     2.9                      break;
    2.10                  case opc_lneg:
    2.11                      emit(out, "@1 = @1.neg64();", smapper.getL(0));
     3.1 --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java	Thu Feb 07 17:24:19 2013 +0100
     3.2 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java	Thu Feb 07 17:41:41 2013 +0100
     3.3 @@ -47,6 +47,10 @@
     3.4          return x % y;
     3.5      }
     3.6      
     3.7 +    private static int neg(int x) {
     3.8 +        return (-x);
     3.9 +    }
    3.10 +    
    3.11      @Compare public int addOverflow() {
    3.12          return add(Integer.MAX_VALUE, 1);
    3.13      }
    3.14 @@ -91,6 +95,18 @@
    3.15          return mod(1, 2);
    3.16      }
    3.17      
    3.18 +    @Compare public int negate() {
    3.19 +        return neg(123456);
    3.20 +    }
    3.21 +    
    3.22 +    @Compare public int negateMaxInt() {
    3.23 +        return neg(Integer.MAX_VALUE);
    3.24 +    }
    3.25 +    
    3.26 +    @Compare public int negateMinInt() {
    3.27 +        return neg(Integer.MIN_VALUE);
    3.28 +    }
    3.29 +    
    3.30      @Compare public int sumTwoDimensions() {
    3.31          int[][] matrix = createMatrix(4, 3);
    3.32          matrix[0][0] += 10;