summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-08 15:11:25 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-08 15:11:25 -0800
commit733d78b0584b1b5dbf2fb3545dfa36e4268e0177 (patch)
tree7bd5017de967f6ac4941f31ddaa640f2d43c71db
parentd60432e933d6940dd2030addb6be13ec64a927b1 (diff)
downloadbinaryen-733d78b0584b1b5dbf2fb3545dfa36e4268e0177.tar.gz
binaryen-733d78b0584b1b5dbf2fb3545dfa36e4268e0177.tar.bz2
binaryen-733d78b0584b1b5dbf2fb3545dfa36e4268e0177.zip
negative nans
-rw-r--r--src/wasm-s-parser.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 30ee0da02..0d3b60786 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -706,17 +706,20 @@ private:
std::cerr << "make constant " << str << " ==> " << ret->value << '\n';
return ret;
}
- if (str[0] == 'n' && str[1] == 'a' && str[2] == 'n' && str[3] == ':') {
- assert(str[4] == '0' && str[5] == 'x');
+ bool negative = str[0] == '-';
+ const char *positive = negative ? str + 1 : str;
+ if (positive[0] == 'n' && positive[1] == 'a' && positive[2] == 'n' && positive[3] == ':') {
+ assert(positive[4] == '0' && positive[5] == 'x');
switch (type) {
case f32: {
union {
uint32_t pattern;
float f;
} u;
- std::istringstream istr(str+4);
+ std::istringstream istr(positive+4);
istr >> std::hex >> u.pattern;
u.pattern |= 0x7f800000;
+ if (negative) u.pattern |= -1;
if (!isnan(u.f)) u.pattern |= 1;
assert(isnan(u.f));
ret->value.f32 = u.f;
@@ -727,9 +730,10 @@ private:
uint64_t pattern;
double d;
} u;
- std::istringstream istr(str+4);
+ std::istringstream istr(positive+4);
istr >> std::hex >> u.pattern;
u.pattern |= 0x7ff0000000000000LL;
+ if (negative) u.pattern |= -1LL;
if (!isnan(u.d)) u.pattern |= 1;
assert(isnan(u.d));
ret->value.f64 = u.d;