diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-interpreter.h | 10 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 18 |
2 files changed, 18 insertions, 10 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index dae45d529..13c476160 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -345,10 +345,7 @@ public: case Sub: return Flow(Literal(l - r)); case Mul: return Flow(Literal(l * r)); case Div: return Flow(Literal(l / r)); - case CopySign: { - if (isnan(r)) r = 0; - return Literal(std::copysign(l, r)); - } + case CopySign: return Literal(std::copysign(l, r)); case Min: { if (l == r && l == 0) return Literal(1/l < 0 ? l : r); return Literal(std::min(l, r)); @@ -366,10 +363,7 @@ public: case Sub: return Flow(Literal(l - r)); case Mul: return Flow(Literal(l * r)); case Div: return Flow(Literal(l / r)); - case CopySign: { - if (isnan(r)) r = 0; - return Literal(std::copysign(l, r)); - } + case CopySign: return Literal(std::copysign(l, r)); case Min: { if (l == r && l == 0) return Literal(1/l < 0 ? l : r); return Literal(std::min(l, r)); diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index dbd6f7a95..854982e62 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -32,7 +32,8 @@ IString MODULE("module"), CALL_INDIRECT("call_indirect"), INFINITY_("infinity"), NEG_INFINITY("-infinity"), - NAN_("nan"); + NAN_("nan"), + NEG_NAN("-nan"); // // An element in an S-Expression: a list or a string @@ -519,6 +520,7 @@ private: } Expression* makeConst(Element& s, WasmType type) { + const char *str = s[1]->c_str(); auto ret = allocator.alloc<Const>(); ret->type = ret->value.type = type; if (isWasmTypeFloat(type)) { @@ -528,6 +530,7 @@ private: case f64: ret->value.f64 = std::numeric_limits<double>::infinity(); break; default: onError(); } + //std::cerr << "make constant " << str << " ==> " << ret->value << '\n'; return ret; } if (s[1]->str() == NEG_INFINITY) { @@ -536,6 +539,7 @@ private: case f64: ret->value.f64 = -std::numeric_limits<double>::infinity(); break; default: onError(); } + //std::cerr << "make constant " << str << " ==> " << ret->value << '\n'; return ret; } if (s[1]->str() == NAN_) { @@ -544,10 +548,19 @@ private: case f64: ret->value.f64 = std::nan(""); break; default: onError(); } + //std::cerr << "make constant " << str << " ==> " << ret->value << '\n'; + return ret; + } + if (s[1]->str() == NEG_NAN) { + switch (type) { + case f32: ret->value.f32 = -std::nan(""); break; + case f64: ret->value.f64 = -std::nan(""); break; + default: onError(); + } + //std::cerr << "make constant " << str << " ==> " << ret->value << '\n'; return ret; } } - const char *str = s[1]->c_str(); switch (type) { case i32: { std::istringstream istr(str); @@ -587,6 +600,7 @@ private: } default: onError(); } + //std::cerr << "make constant " << str << " ==> " << ret->value << '\n'; return ret; } |