From 03ed725262161dab5e028322b4e6f053b15e721d Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Wed, 17 Jul 2019 18:45:36 +0200 Subject: [PATCH] implements abs instruction --- .../binary/BinaryModuleWriter.java | 11 ++++++++ .../module/WasmNumericInstruction.java | 1 + .../jwebassembly/wasm/NumericOperator.java | 1 + .../jwebassembly/watparser/WatParser.java | 6 +++++ .../jwebassembly/runtime/MathAPI.java | 26 +++++++++++++++++++ 5 files changed, 45 insertions(+) diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index 1e35a01..68c3b47 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -973,6 +973,17 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod default: } break; + case abs: + switch( valueType ) { + case f32: + op = F32_ABS; + break; + case f64: + op = F64_ABS; + break; + default: + } + break; case ceil: switch( valueType ) { case f32: diff --git a/src/de/inetsoftware/jwebassembly/module/WasmNumericInstruction.java b/src/de/inetsoftware/jwebassembly/module/WasmNumericInstruction.java index 491fa4b..b1b8a3f 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmNumericInstruction.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmNumericInstruction.java @@ -95,6 +95,7 @@ class WasmNumericInstruction extends WasmInstruction { switch( numOp ) { case neg: case sqrt: + case abs: case ceil: case floor: case trunc: diff --git a/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java b/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java index f2b5e7e..74bfd01 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java +++ b/src/de/inetsoftware/jwebassembly/wasm/NumericOperator.java @@ -44,6 +44,7 @@ public enum NumericOperator { ref_eq, ref_ne, sqrt, + abs, ceil, floor, trunc, diff --git a/src/de/inetsoftware/jwebassembly/watparser/WatParser.java b/src/de/inetsoftware/jwebassembly/watparser/WatParser.java index a3bc683..d57ab2f 100644 --- a/src/de/inetsoftware/jwebassembly/watparser/WatParser.java +++ b/src/de/inetsoftware/jwebassembly/watparser/WatParser.java @@ -84,6 +84,9 @@ public class WatParser extends WasmCodeBuilder { case "i64.trunc_sat_f64_s": addConvertInstruction( ValueTypeConvertion.d2l, javaCodePos, lineNumber ); break; + case "f32.abs": + addNumericInstruction( NumericOperator.abs, ValueType.f32, javaCodePos, lineNumber ); + break; case "f32.ceil": addNumericInstruction( NumericOperator.ceil, ValueType.f32, javaCodePos, lineNumber ); break; @@ -117,6 +120,9 @@ public class WatParser extends WasmCodeBuilder { case "f32.trunc": addNumericInstruction( NumericOperator.trunc, ValueType.f32, javaCodePos, lineNumber ); break; + case "f64.abs": + addNumericInstruction( NumericOperator.abs, ValueType.f64, javaCodePos, lineNumber ); + break; case "f64.ceil": addNumericInstruction( NumericOperator.ceil, ValueType.f64, javaCodePos, lineNumber ); break; diff --git a/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java b/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java index 50cb50b..2416a12 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java +++ b/test/de/inetsoftware/jwebassembly/runtime/MathAPI.java @@ -69,6 +69,9 @@ public class MathAPI extends AbstractBaseTest { addParam( list, script, "roundF_3_5" ); addParam( list, script, "roundD3_8" ); addParam( list, script, "roundD_3_8" ); + addParam( list, script, "random" ); + addParam( list, script, "absF" ); + addParam( list, script, "absD" ); } rule.setTestParameters( list ); return list; @@ -217,5 +220,28 @@ public class MathAPI extends AbstractBaseTest { // SpiderMonkey does not support BigInt currently return (int)Math.round( -3.8 ); } + + @Export + static int random() { + if( Math.random() < 0 ) { + return 1; + } else if( Math.random() > 1 ) { + return 2; + } else if( Math.random() == Math.random() ) { + return 3; + } else { + return 4; + } + } + + @Export + static float absF() { + return Math.abs( -3.8F ); + } + + @Export + static double absD() { + return Math.abs( -3.8 ); + } } }