diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 3e2dcab19b0..af75e752574 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -1122,9 +1122,9 @@ Literal Literal::nearbyint() const { Literal Literal::sqrt() const { switch (type.getBasic()) { case Type::f32: - return Literal(std::sqrt(getf32())); + return standardizeNaN(Literal(std::sqrt(getf32()))); case Type::f64: - return Literal(std::sqrt(getf64())); + return standardizeNaN(Literal(std::sqrt(getf64()))); default: WASM_UNREACHABLE("unexpected type"); } diff --git a/test/gtest/interpreter.cpp b/test/gtest/interpreter.cpp index c1371aa2dad..011ac6e49ae 100644 --- a/test/gtest/interpreter.cpp +++ b/test/gtest/interpreter.cpp @@ -685,6 +685,22 @@ TEST(InterpreterTest, SqrtF32) { EXPECT_EQ(results, expected); } +TEST(InterpreterTest, SqrtF32Neg) { + Module wasm; + IRBuilder builder(wasm); + + ASSERT_FALSE(builder.makeConst(Literal(float(-5.0))).getErr()); + ASSERT_FALSE(builder.makeUnary(SqrtFloat32).getErr()); + + auto expr = builder.build(); + ASSERT_FALSE(expr.getErr()); + + auto results = Interpreter{}.runTest(*expr); + std::vector expected{Literal(std::nanf("0x400000"))}; + + EXPECT_EQ(results, expected); +} + TEST(InterpreterTest, CeilF32) { Module wasm; IRBuilder builder(wasm); @@ -852,6 +868,22 @@ TEST(InterpreterTest, SqrtF64) { EXPECT_EQ(results, expected); } +TEST(InterpreterTest, SqrtF64Neg) { + Module wasm; + IRBuilder builder(wasm); + + ASSERT_FALSE(builder.makeConst(Literal(double(-5.0))).getErr()); + ASSERT_FALSE(builder.makeUnary(SqrtFloat64).getErr()); + + auto expr = builder.build(); + ASSERT_FALSE(expr.getErr()); + + auto results = Interpreter{}.runTest(*expr); + std::vector expected{Literal(std::nan("0x8000000000000"))}; + + EXPECT_EQ(results, expected); +} + TEST(InterpreterTest, CeilF64) { Module wasm; IRBuilder builder(wasm);