diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index 4160555..5fac4f0 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -442,6 +442,9 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod case l2i: op = I32_WRAP_I64; break; + case i2l: + op = I64_EXTEND_S_I32; + break; default: throw new Error( "Unknown cast: " + cast ); } diff --git a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java index e4fee88..c24fbb4 100644 --- a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java +++ b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java @@ -117,4 +117,5 @@ interface InstructionOpcodes { static final int I32_WRAP_I64 = 0xA7; + static final int I64_EXTEND_S_I32 = 0xAC; } diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java index 4d9d671..eb79f40 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java @@ -399,18 +399,21 @@ public abstract class ModuleWriter implements Closeable { writeNumericOperator( NumericOperator.shl, ValueType.i32 ); break; case 121: // lshl + writeCast( ValueTypeConvertion.i2l ); // the shift parameter must be of type long!!! writeNumericOperator( NumericOperator.shl, ValueType.i64 ); break; case 122: // ishr writeNumericOperator( NumericOperator.shr_s, ValueType.i32 ); break; case 123: // lshr + writeCast( ValueTypeConvertion.i2l ); // the shift parameter must be of type long!!! writeNumericOperator( NumericOperator.shr_s, ValueType.i64 ); break; case 124: // iushr writeNumericOperator( NumericOperator.shr_u, ValueType.i32 ); break; case 125: // lushr + writeCast( ValueTypeConvertion.i2l ); // the shift parameter must be of type long!!! writeNumericOperator( NumericOperator.shr_u, ValueType.i64 ); break; case 126: // iand diff --git a/src/de/inetsoftware/jwebassembly/module/ValueTypeConvertion.java b/src/de/inetsoftware/jwebassembly/module/ValueTypeConvertion.java index 2e5610a..087394b 100644 --- a/src/de/inetsoftware/jwebassembly/module/ValueTypeConvertion.java +++ b/src/de/inetsoftware/jwebassembly/module/ValueTypeConvertion.java @@ -23,4 +23,5 @@ package de.inetsoftware.jwebassembly.module; */ public enum ValueTypeConvertion { l2i, + i2l, } diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index 56af721..2825e6d 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -179,6 +179,9 @@ public class TextModuleWriter extends ModuleWriter { case l2i: op = "i32.wrap/i64"; break; + case i2l: + op = "i64.extend_s/i32"; + break; default: throw new Error( "Unknown cast: " + cast ); } diff --git a/test/de/inetsoftware/jwebassembly/math/MathOperations.java b/test/de/inetsoftware/jwebassembly/math/MathOperations.java index 8d06bbe..09d272f 100644 --- a/test/de/inetsoftware/jwebassembly/math/MathOperations.java +++ b/test/de/inetsoftware/jwebassembly/math/MathOperations.java @@ -67,6 +67,8 @@ public class MathOperations { addParam( list, script, "mulDivLong" ); addParam( list, script, "mulDivFloat" ); addParam( list, script, "mulDivDouble" ); + addParam( list, script, "intBits" ); + addParam( list, script, "longBits" ); } return list; } @@ -177,5 +179,29 @@ public class MathOperations { return a; } + @Export + static int intBits() { + int a = 1; + a = a << 1; + a = a | 15; + a = a & 4; + int b = Integer.MIN_VALUE; + b = b >>> 1; + b = b >> 2; + return a ^ b; + } + + @Export + static int longBits() { + long a = 1; + a = a << 1; + a = a | 15; + a = a & 4; + long b = Long.MIN_VALUE; + b = b >>> 1; + b = b >> 2; + return (int)(a ^ (b >> 32)); + } + } }