summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm2asm.h13
-rw-r--r--test/unit.2asm.js12
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)));
}
}