Commit db990834 by Tim Van Patten Committed by Commit Bot

Support NaN conversion in Float32ToFloat16

Add NaN support to Float32ToFloat16. This follows Dawn's implementation: https://dawn-review.googlesource.com/c/dawn/+/8361 Bug: 3612 Test: angle_unittests Change-Id: I624bee2fc48c46b8a69cd38654679ac3cbd7c09f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1678407 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent f0ea83a4
...@@ -187,9 +187,13 @@ inline unsigned short float32ToFloat16(float fp32) ...@@ -187,9 +187,13 @@ inline unsigned short float32ToFloat16(float fp32)
unsigned int sign = (fp32i & 0x80000000) >> 16; unsigned int sign = (fp32i & 0x80000000) >> 16;
unsigned int abs = fp32i & 0x7FFFFFFF; unsigned int abs = fp32i & 0x7FFFFFFF;
if (abs > 0x47FFEFFF) // Infinity if (abs > 0x7F800000)
{ { // NaN
return static_cast<unsigned short>(sign | 0x7FFF); return 0x7FFF;
}
else if (abs > 0x47FFEFFF)
{ // Infinity
return static_cast<uint16_t>(sign | 0x7C00);
} }
else if (abs < 0x38800000) // Denormal else if (abs < 0x38800000) // Denormal
{ {
......
...@@ -348,4 +348,23 @@ TEST(MathUtilTest, RangeIteration) ...@@ -348,4 +348,23 @@ TEST(MathUtilTest, RangeIteration)
EXPECT_EQ(range.length(), expected); EXPECT_EQ(range.length(), expected);
} }
// Tests for float32 to float16 conversion
TEST(MathUtilTest, Float32ToFloat16)
{
ASSERT_EQ(float32ToFloat16(0.0f), 0x0000);
ASSERT_EQ(float32ToFloat16(-0.0f), 0x8000);
float inf = std::numeric_limits<float>::infinity();
ASSERT_EQ(float32ToFloat16(inf), 0x7C00);
ASSERT_EQ(float32ToFloat16(-inf), 0xFC00);
// Check that NaN is converted to a value in one of the float16 NaN ranges
float nan = std::numeric_limits<float>::quiet_NaN();
uint16_t nan16 = float32ToFloat16(nan);
ASSERT_TRUE(nan16 > 0xFC00 || (nan16 < 0x8000 && nan16 > 0x7C00));
ASSERT_EQ(float32ToFloat16(1.0f), 0x3C00);
}
} // anonymous namespace } // anonymous namespace
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment