diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-12-05 21:12:48 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-12-05 21:12:48 -0800 |
commit | a7a20cc4a0323ebd4743da5219650cc139264d3a (patch) | |
tree | 68865ad68d83fcf161004aaf9edf98f10055031f /src | |
parent | 0f592cc75ce20168a76264a76ed8dd62d7d00885 (diff) | |
download | binaryen-a7a20cc4a0323ebd4743da5219650cc139264d3a.tar.gz binaryen-a7a20cc4a0323ebd4743da5219650cc139264d3a.tar.bz2 binaryen-a7a20cc4a0323ebd4743da5219650cc139264d3a.zip |
handle negative zero in wasm2asm
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm2asm.h | 13 |
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(); } } |