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);