summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r--src/wasm-interpreter.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index d0e64c91e..5e3011282 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -455,7 +455,14 @@ private:
case TruncSFloat64: return truncSFloat(curr, value);
case TruncUFloat64: return truncUFloat(curr, value);
case ReinterpretFloat: return value.castToI64();
- case DemoteFloat64: return value.truncateToF32();
+ case DemoteFloat64: {
+ double val = value.getFloat();
+ if (std::isnan(val)) return Literal(float(val));
+ if (std::isinf(val)) return Literal(float(val));
+ if (val < -std::numeric_limits<float>::max()) return Literal(-std::numeric_limits<float>::infinity());
+ if (val > std::numeric_limits<float>::max()) return Literal(std::numeric_limits<float>::infinity());
+ return value.truncateToF32();
+ }
default: abort();
}
}