# HG changeset patch # User Martin Soch # Date 1359659978 -3600 # Node ID 4c2b92281cdcd93cca84837955f7e9c1390a4d23 # Parent 189f695d0b02f3701288376d82c24e7b4e9b5506 Added binary OR for Long + tests for AND and OR diff -r 189f695d0b02 -r 4c2b92281cdc 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 15:26:09 2013 +0100 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Thu Jan 31 20:19:38 2013 +0100 @@ -91,6 +91,7 @@ Number.prototype.and64 = function(x) { var low = this & x; + low += (low < 0) ? (__m32+1) : 0; if (this.hi && x.hi) { var hi = this.hi & x.hi; return hi.next32(low); @@ -98,6 +99,16 @@ return low; }; +Number.prototype.or64 = function(x) { + var low = this | x; + low += (low < 0) ? (__m32+1) : 0; + if (this.hi || x.hi) { + var hi = this.hi | x.hi; + return hi.next32(low); + }; + return low; +}; + Number.prototype.shl64 = function(x) { if (x >= 32) { var hi = (this << (x - 32)) | 0; diff -r 189f695d0b02 -r 4c2b92281cdc vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 31 15:26:09 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 31 20:19:38 2013 +0100 @@ -588,7 +588,7 @@ emit(out, "@1 |= @2;", smapper.getI(1), smapper.popI()); break; case opc_lor: - emit(out, "@1 |= @2;", smapper.getL(1), smapper.popL()); + emit(out, "@1 = @1.or64(@2);", smapper.getL(1), smapper.popL()); break; case opc_ixor: emit(out, "@1 ^= @2;", smapper.getI(1), smapper.popI()); diff -r 189f695d0b02 -r 4c2b92281cdc vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Thu Jan 31 15:26:09 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Thu Jan 31 20:19:38 2013 +0100 @@ -255,6 +255,26 @@ 45); } + @Test public void longAnd() throws Exception { + final long res = 0x00fa37d7763e0ca1l & 0xa7b3432fff00123el; + assertExec("LOng binary AND", + Numbers.class, "andL__J_3B_3B", + Double.valueOf(res), + new byte[] { (byte)0x00, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 }, + new byte[] { (byte)0xa7, (byte)0xb3, (byte)0x43, (byte)0x2f, (byte)0xff, (byte)0x00, (byte)0x12, (byte)0x3e } + ); + } + + @Test public void longOr() throws Exception { + final long res = 0x00fa37d7763e0ca1l | 0xa7b3432fff00123el; + assertExec("Long binary OR", + Numbers.class, "orL__J_3B_3B", + Double.valueOf(res), + new byte[] { (byte)0x00, (byte)0xfa, (byte)0x37, (byte)0xd7, (byte)0x76, (byte)0x3e, (byte)0x0c, (byte)0xa1 }, + new byte[] { (byte)0xa7, (byte)0xb3, (byte)0x43, (byte)0x2f, (byte)0xff, (byte)0x00, (byte)0x12, (byte)0x3e } + ); + } + private static CharSequence codeSeq; private static Invocable code; diff -r 189f695d0b02 -r 4c2b92281cdc vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Thu Jan 31 15:26:09 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Thu Jan 31 20:19:38 2013 +0100 @@ -111,4 +111,20 @@ 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); + ByteArrayInputStream isY = new ByteArrayInputStream(arrY); + DataInputStream disY = new DataInputStream(isY); + return (disX.readLong() & disY.readLong()); + } + + public static long orL(byte[] arrX, byte[] arrY) throws IOException { + ByteArrayInputStream isX = new ByteArrayInputStream(arrX); + DataInputStream disX = new DataInputStream(isX); + ByteArrayInputStream isY = new ByteArrayInputStream(arrY); + DataInputStream disY = new DataInputStream(isY); + return (disX.readLong() | disY.readLong()); + } }