summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-05 21:12:48 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-05 21:12:48 -0800
commita7a20cc4a0323ebd4743da5219650cc139264d3a (patch)
tree68865ad68d83fcf161004aaf9edf98f10055031f /src
parent0f592cc75ce20168a76264a76ed8dd62d7d00885 (diff)
downloadbinaryen-a7a20cc4a0323ebd4743da5219650cc139264d3a.tar.gz
binaryen-a7a20cc4a0323ebd4743da5219650cc139264d3a.tar.bz2
binaryen-a7a20cc4a0323ebd4743da5219650cc139264d3a.zip
handle negative zero in wasm2asm
Diffstat (limited to 'src')
-rw-r--r--src/wasm2asm.h13
1 files changed, 11 insertions, 2 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();
}
}