# HG changeset patch # User Martin Soch # Date 1359695358 -3600 # Node ID 2d537f8cd604f6d149c66f2cf5fad23ece7c2a7e # Parent e606853325f16edff2590ee53cf60525bfb099bc Long operator >>> and tests diff -r e606853325f1 -r 2d537f8cd604 emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Thu Jan 31 20:37:12 2013 +0100 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Fri Feb 01 06:09:18 2013 +0100 @@ -121,10 +121,10 @@ Number.prototype.shl64 = function(x) { if (x >= 32) { - var hi = (this << (x - 32)) | 0; + var hi = this << (x - 32); return hi.next32(0); } else { - var hi = (this.high32() << x) | 0; + var hi = this.high32() << x; var low_reminder = this >> (32 - x); hi |= low_reminder; var low = this << x; @@ -135,11 +135,11 @@ Number.prototype.shr64 = function(x) { if (x >= 32) { - var low = (this.high32() >> (x - 32)) | 0; + var low = this.high32() >> (x - 32); low += (low < 0) ? (__m32+1) : 0; return low; } else { - var low = (this >> x) | 0; + var low = this >> x; var hi_reminder = this.high32() << (32 - x); low |= hi_reminder; low += (low < 0) ? (__m32+1) : 0; @@ -148,6 +148,21 @@ } }; +Number.prototype.ushr64 = function(x) { + if (x >= 32) { + var low = this.high32() >>> (x - 32); + low += (low < 0) ? (__m32+1) : 0; + return low; + } else { + var low = this >>> x; + var hi_reminder = this.high32() << (32 - x); + low |= hi_reminder; + low += (low < 0) ? (__m32+1) : 0; + var hi = this.high32() >>> x; + return hi.next32(low); + } +}; + Number.prototype.compare64 = function(x) { if (this.hi == x.hi) { return (this == x) ? 0 : ((this < x) ? -1 : 1); diff -r e606853325f1 -r 2d537f8cd604 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 31 20:37:12 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Feb 01 06:09:18 2013 +0100 @@ -624,7 +624,7 @@ emit(out, "@1 >>>= @2;", smapper.getI(1), smapper.popI()); break; case opc_lushr: - emit(out, "@1 >>>= @2;", smapper.getL(1), smapper.popI()); + emit(out, "@1 = @1.ushr64(@2);", smapper.getL(1), smapper.popI()); break; case opc_iinc: { ++i; diff -r e606853325f1 -r 2d537f8cd604 vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Thu Jan 31 20:37:12 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Fri Feb 01 06:09:18 2013 +0100 @@ -255,6 +255,42 @@ 45); } + @Test public void longUShiftR1() throws Exception { + final long res = 0x00fa37d7763e0ca1l >>> 5; + assertExec("Long >>> 5", + Numbers.class, "ushrL__J_3BI", + Double.valueOf(res), + new byte[] { (byte)0x00, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 }, + 5); + } + + @Test public void longUShiftR2() throws Exception { + final long res = 0x00fa37d7763e0ca1l >>> 45; + assertExec("Long >>> 45", + Numbers.class, "ushrL__J_3BI", + Double.valueOf(res), + new byte[] { (byte)0x00, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 }, + 45); + } + + @Test public void longUShiftR3() throws Exception { + final long res = 0xf0fa37d7763e0ca1l >>> 5; + assertExec("Long >>> 5", + Numbers.class, "ushrL__J_3BI", + Double.valueOf(res), + new byte[] { (byte)0xf0, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 }, + 5); + } + + @Test public void longUShiftR4() throws Exception { + final long res = 0xf0fa37d7763e0ca1l >>> 45; + assertExec("Long >>> 45", + Numbers.class, "ushrL__J_3BI", + Double.valueOf(res), + new byte[] { (byte)0xf0, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 }, + 45); + } + @Test public void longAnd() throws Exception { final long res = 0x00fa37d7763e0ca1l & 0xa7b3432fff00123el; assertExec("LOng binary AND", diff -r e606853325f1 -r 2d537f8cd604 vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Thu Jan 31 20:37:12 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Fri Feb 01 06:09:18 2013 +0100 @@ -112,6 +112,12 @@ return (disValue.readLong() >> nBits); } + public static long ushrL(byte[] arrValue, int nBits) throws IOException { + ByteArrayInputStream isValue = new ByteArrayInputStream(arrValue); + DataInputStream disValue = new DataInputStream(isValue); + return (disValue.readLong() >>> nBits); + } + public static long andL(byte[] arrX, byte[] arrY) throws IOException { ByteArrayInputStream isX = new ByteArrayInputStream(arrX); DataInputStream disX = new DataInputStream(isX);