From c2b8505634cb6517fff6f0da9e41a92861f7cb74 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Thu, 18 Jul 2019 19:21:11 +0200 Subject: [PATCH] Math.min/max operation --- .../binary/BinaryModuleWriter.java | 11 +++++++++ .../jwebassembly/wasm/NumericOperator.java | 1 + .../jwebassembly/watparser/WatParser.java | 6 +++++ .../jwebassembly/module/WatParserTest.java | 10 ++++++++ .../jwebassembly/runtime/MathAPI.java | 24 +++++++++++++++++++ 5 files changed, 52 insertions(+) diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index 68c3b47..633b1c2 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -948,6 +948,17 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod default: } break; + case min: + switch( valueType ) { + case f32: + op = F32_MIN; + break; + case f64: + op = F64_MIN; + break; + default: + } + break; case ifnull: op = REF_ISNULL; break; diff --git a/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java b/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java index 74bfd01..d1dec44 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java +++ b/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java @@ -39,6 +39,7 @@ public enum NumericOperator { le, ge, max, + min, ifnull, ifnonnull, ref_eq, diff --git a/src/de/inetsoftware/jwebassembly/watparser/WatParser.java b/src/de/inetsoftware/jwebassembly/watparser/WatParser.java index d57ab2f..fab3bbd 100644 --- a/src/de/inetsoftware/jwebassembly/watparser/WatParser.java +++ b/src/de/inetsoftware/jwebassembly/watparser/WatParser.java @@ -102,6 +102,9 @@ public class WatParser extends WasmCodeBuilder { case "f32.max": addNumericInstruction( NumericOperator.max, ValueType.f32, javaCodePos, lineNumber ); break; + case "f32.min": + addNumericInstruction( NumericOperator.min, ValueType.f32, javaCodePos, lineNumber ); + break; case "f32.mul": addNumericInstruction( NumericOperator.mul, ValueType.f32, javaCodePos, lineNumber ); break; @@ -138,6 +141,9 @@ public class WatParser extends WasmCodeBuilder { case "f64.max": addNumericInstruction( NumericOperator.max, ValueType.f64, javaCodePos, lineNumber ); break; + case "f64.min": + addNumericInstruction( NumericOperator.min, ValueType.f64, javaCodePos, lineNumber ); + break; case "f64.mul": addNumericInstruction( NumericOperator.mul, ValueType.f64, javaCodePos, lineNumber ); break; diff --git a/test/de/inetsoftware/jwebassembly/module/WatParserTest.java b/test/de/inetsoftware/jwebassembly/module/WatParserTest.java index 6f80cfa..f0e0abe 100644 --- a/test/de/inetsoftware/jwebassembly/module/WatParserTest.java +++ b/test/de/inetsoftware/jwebassembly/module/WatParserTest.java @@ -166,6 +166,11 @@ public class WatParserTest { test( "f32.max" ); } + @Test + public void f32_min() throws IOException { + test( "f32.min" ); + } + @Test public void f32_mul() throws IOException { test( "f32.mul" ); @@ -226,6 +231,11 @@ public class WatParserTest { test( "f64.max" ); } + @Test + public void f64_min() throws IOException { + test( "f64.min" ); + } + @Test public void f64_mul() throws IOException { test( "f64.mul" ); diff --git a/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java b/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java index 2416a12..7ca33e1 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java +++ b/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java @@ -72,6 +72,10 @@ public class MathAPI extends AbstractBaseTest { addParam( list, script, "random" ); addParam( list, script, "absF" ); addParam( list, script, "absD" ); + addParam( list, script, "maxF" ); + addParam( list, script, "maxD" ); + addParam( list, script, "minF" ); + addParam( list, script, "minD" ); } rule.setTestParameters( list ); return list; @@ -243,5 +247,25 @@ public class MathAPI extends AbstractBaseTest { static double absD() { return Math.abs( -3.8 ); } + + @Export + static float maxF() { + return Math.max( -3.8F, 7.5F ); + } + + @Export + static double maxD() { + return Math.max( -3.8, 7.5 ); + } + + @Export + static float minF() { + return Math.min( -3.8F, 7.5F ); + } + + @Export + static double minD() { + return Math.min( -3.8, 7.5 ); + } } }