diff options
-rw-r--r-- | src/wasm2asm.h | 13 | ||||
-rw-r--r-- | test/unit.2asm.js | 12 |
2 files changed, 17 insertions, 8 deletions
diff --git a/src/wasm2asm.h b/src/wasm2asm.h index 2630a3c82..283e92395 100644 --- a/src/wasm2asm.h +++ b/src/wasm2asm.h @@ -699,10 +699,19 @@ Ref Wasm2AsmBuilder::processFunctionBody(Expression* curr, IString result) { // TODO: i64. statementize? case f32: { Ref ret = ValueBuilder::makeCall(MATH_FROUND); - ret[2]->push_back(ValueBuilder::makeDouble(curr->value.f32)); + Const fake; + fake.value = double(curr->value.f32); + fake.type = f64; + ret[2]->push_back(visitConst(&fake)); return ret; } - case f64: return ValueBuilder::makeUnary(PLUS, ValueBuilder::makeDouble(curr->value.f64)); + case f64: { + double d = curr->value.f64; + if (d == 0 && 1/d < 0) { // negative zero + return ValueBuilder::makeUnary(PLUS, ValueBuilder::makeUnary(MINUS, ValueBuilder::makeDouble(0))); + } + return ValueBuilder::makeUnary(PLUS, ValueBuilder::makeDouble(curr->value.f64)); + } default: abort(); } } diff --git a/test/unit.2asm.js b/test/unit.2asm.js index c33a750d0..efc6dbedf 100644 --- a/test/unit.2asm.js +++ b/test/unit.2asm.js @@ -169,15 +169,15 @@ function asmFunc() { { Math_fround(z); y; - Math_fround(5); - Math_fround(0); - Math_fround(5); - Math_fround(0); + Math_fround(5.0); + Math_fround(0.0); + Math_fround(5.0); + Math_fround(0.0); } } function negZero() { - return 0.0; + return -0.0; } function abs() { @@ -187,7 +187,7 @@ function asmFunc() { wasm2asm_i32$0 = (wasm2asm_i32$1 = (asm2wasm_i32_temp | 0) < (0 | 0), wasm2asm_i32$2 = 0 - asm2wasm_i32_temp | 0, wasm2asm_i32$3 = asm2wasm_i32_temp, wasm2asm_i32$1 ? wasm2asm_i32$2 : wasm2asm_i32$3); x = wasm2asm_i32$0; y = Math_abs(0.0); - z = Math_fround(Math_abs(Math_fround(0))); + z = Math_fround(Math_abs(Math_fround(0.0))); } } |