Skip to content

Commit

Permalink
Implement f64.promote_f32 instruction
Browse files Browse the repository at this point in the history
  • Loading branch information
chfast committed Aug 6, 2020
1 parent 28391b3 commit d441269
Showing 1 changed file with 12 additions and 27 deletions.
39 changes: 12 additions & 27 deletions test/unittests/execute_floating_point_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,33 +98,18 @@ TEST(execute_floating_point, f64_promote_f32)
EXPECT_THAT(execute(*instance, 0, {f32_limits::infinity()}), Result(f64_limits::infinity()));
EXPECT_THAT(execute(*instance, 0, {-f32_limits::infinity()}), Result(-f64_limits::infinity()));

{
// The canonical NaN must result in canonical NaN (only the top bit set).
const auto result = execute(*instance, 0, {nan<float>()});
ASSERT_TRUE(!result.trapped && result.has_value);
const auto cnan = result.value.f64;
EXPECT_TRUE(std::isnan(cnan));
EXPECT_EQ(get_nan_payload(cnan), FPUtils<double>::CanonicalNaNPayload);
}

{
// An arithmetic NaN must result in any arithmetic NaN (payload >= canonical payload).
const auto result =
execute(*instance, 0, {nan<float>(FPUtils<float>::CanonicalNaNPayload + 1)});
ASSERT_TRUE(!result.trapped && result.has_value);
const auto anan = result.value.f64;
EXPECT_TRUE(std::isnan(anan));
EXPECT_GT(get_nan_payload(anan), FPUtils<double>::CanonicalNaNPayload);
}

{
// Other NaN must also result in arithmetic NaN.
const auto result = execute(*instance, 0, {nan<float>(1)});
ASSERT_TRUE(!result.trapped && result.has_value);
const auto nan = result.value.f64;
EXPECT_TRUE(std::isnan(nan));
EXPECT_GT(get_nan_payload(nan), FPUtils<double>::CanonicalNaNPayload);
}
// The canonical NaN must result in canonical NaN (only the top bit set).
EXPECT_THAT(execute(*instance, 0, {FP32::nan()}), Result(FP64::nan()));

// An arithmetic NaN must result in any arithmetic NaN (payload >= canonical payload).
const auto res1 = execute(*instance, 0, {FP32::nan(FP32::canon + 1)});
ASSERT_TRUE(!res1.trapped && res1.has_value);
EXPECT_GT(FP{res1.value.f64}.nan_payload(), FP64::canon);

// Other NaN must also result in arithmetic NaN.
const auto res2 = execute(*instance, 0, {FP32::nan(1)});
ASSERT_TRUE(!res2.trapped && res2.has_value);
EXPECT_GT(FP{res2.value.f64}.nan_payload(), FP64::canon);
}


Expand Down

0 comments on commit d441269

Please sign in to comment.