summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wasm-interpreter.h10
-rw-r--r--src/wasm-s-parser.h18
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;
}