diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index 0e11080..dd9834d 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -548,11 +548,41 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod protected void writeCast( ValueTypeConvertion cast ) throws IOException { int op; switch( cast ) { + case i2l: + op = I64_EXTEND_S_I32; + break; + case i2f: + op = F32_CONVERT_S_I32; + break; + case i2d: + op = F64_CONVERT_S_I32; + break; case l2i: op = I32_WRAP_I64; break; - case i2l: - op = I64_EXTEND_S_I32; + case l2f: + op = F32_CONVERT_S_I64; + break; + case l2d: + op = F64_CONVERT_S_I64; + break; + case f2i: + op = I32_TRUNC_S_F32; + break; + case f2l: + op = I64_TRUNC_S_F32; + break; + case f2d: + op = F64_PROMOTE_F32; + break; + case d2i: + op = I32_TRUNC_S_F64; + break; + case d2l: + op = I64_TRUNC_S_F64; + break; + case d2f: + op = F32_DEMOTE_F64; break; default: throw new Error( "Unknown cast: " + cast ); diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java index e07e79a..cf6e23f 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java @@ -582,9 +582,39 @@ public abstract class ModuleWriter implements Closeable { case 133: // i2l writeCast( ValueTypeConvertion.i2l ); break; + case 134: // i2f + writeCast( ValueTypeConvertion.i2f ); + break; + case 135: // i2d + writeCast( ValueTypeConvertion.i2d ); + break; case 136: // l2i writeCast( ValueTypeConvertion.l2i ); break; + case 137: // l2f + writeCast( ValueTypeConvertion.l2f ); + break; + case 138: // l2d + writeCast( ValueTypeConvertion.l2d ); + break; + case 139: // f2i + writeCast( ValueTypeConvertion.f2i ); + break; + case 140: // f2l + writeCast( ValueTypeConvertion.f2l ); + break; + case 141: // f2d + writeCast( ValueTypeConvertion.f2d ); + break; + case 142: // d2i + writeCast( ValueTypeConvertion.d2i ); + break; + case 143: // d2l + writeCast( ValueTypeConvertion.d2l ); + break; + case 144: // d2f + writeCast( ValueTypeConvertion.d2f ); + break; case 145: // i2b writeConstInt( 24 ); writeNumericOperator( NumericOperator.shl, ValueType.i32 ); diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index 5e7af56..24687b1 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -177,11 +177,41 @@ public class TextModuleWriter extends ModuleWriter { protected void writeCast( ValueTypeConvertion cast ) throws IOException { String op; switch( cast ) { + case i2l: + op = "i64.extend_s/i32"; + break; + case i2f: + op = "f32.convert_s/i32"; + break; + case i2d: + op = "f64.convert_s/i32"; + break; case l2i: op = "i32.wrap/i64"; break; - case i2l: - op = "i64.extend_s/i32"; + case l2f: + op = "f32.convert_s/i64"; + break; + case l2d: + op = "f64.convert_s/i64"; + break; + case f2i: + op = "i32.trunc_s/f32"; + break; + case f2l: + op = "i64.trunc_s/f32"; + break; + case f2d: + op = "f64.promote/f32"; + break; + case d2i: + op = "i32.trunc_s/f64"; + break; + case d2l: + op = "i64.trunc_s/f64"; + break; + case d2f: + op = "f32.demote/f64"; break; default: throw new Error( "Unknown cast: " + cast ); diff --git a/test/de/inetsoftware/jwebassembly/runtime/MathOperations.java b/test/de/inetsoftware/jwebassembly/runtime/MathOperations.java index 59188e3..94e23e7 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/MathOperations.java +++ b/test/de/inetsoftware/jwebassembly/runtime/MathOperations.java @@ -89,10 +89,13 @@ public class MathOperations extends AbstractBaseTest { @Export static int addInt( int a, int b ) { int c = 1234567; - int d = -1234567; int e = -1; + double d = -1234567; + int i = 1; + long l = 2; + float f = 3; b++; - return a + b + c + d + e; + return a + b + c + e + (int)d + i + (int)l + (int)f; } @Export @@ -105,9 +108,12 @@ public class MathOperations extends AbstractBaseTest { @Export static float addFloat( float a, float b ) { float c = -1; - float d = 1234; float e = 1.25F; - return a + b + c + d + e; + double d = 1234; + int i = 1; + long l = 2; + float f = 3; + return a + b + c + e + (float)d + i + l + f; } @Export @@ -115,7 +121,10 @@ public class MathOperations extends AbstractBaseTest { double c = -1; double d = 1234; double e = 1.25; - return a + b + c + d + e; + int i = 1; + long l = 2; + float f = 3; + return a + b + c + d + e + i + l + f; } @Export @@ -128,10 +137,12 @@ public class MathOperations extends AbstractBaseTest { long a = -1L; long b = 3L; long c = -1L; - long d = 1234L; - int e = 3; + double d = 1234; + int i = 1; + long l = 2; + float f = 3; a--; - return (int)(a - b - c - d + e); + return (int)(a - b - c - (long)d - i - l - (long)f); } @Export