diff options
Diffstat (limited to 'src/wasm/literal.cpp')
-rw-r--r-- | src/wasm/literal.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 2c61be12a..d4e1bfc45 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -467,6 +467,22 @@ bool Literal::isNaN() { return false; } +bool Literal::isCanonicalNaN() { + if (!isNaN()) { + return false; + } + return (type == Type::f32 && NaNPayload(getf32()) == (1u << 23) - 1) || + (type == Type::f64 && NaNPayload(getf64()) == (1ull << 52) - 1); +} + +bool Literal::isArithmeticNaN() { + if (!isNaN()) { + return false; + } + return (type == Type::f32 && NaNPayload(getf32()) > (1u << 23) - 1) || + (type == Type::f64 && NaNPayload(getf64()) > (1ull << 52) - 1); +} + uint32_t Literal::NaNPayload(float f) { assert(std::isnan(f) && "expected a NaN"); // SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF |