-// Randomly test a large number of fp32 -> fp64 conversions, comparing
-// against the FPU.
-TEST(FP16Test, FP32ReferenceUpconvert) {
- srand(12345);
-
- for (int i = 0; i < 1000000; ++i) {
- unsigned r1 = rand();
- unsigned r2 = rand();
- union fp32 src;
- union fp64 reference, result;
-
- src.u = ((unsigned long long)r1 << 16) ^ r2;
- reference.f = double(src.f);
- result.f = fp32_to_fp64(src.u);
-
- EXPECT_EQ(isnan(result.f), isnan(reference.f));
- if (!isnan(result.f)) {
- EXPECT_EQ(result.ll, reference.ll)
- << src.f << " got converted to " << result.ll << " (" << result.f << ")";
- }
- }
+TEST(FP16Test, Denormals) {
+ const double smallest_fp16_denormal = 5.9604644775390625e-08;
+ EXPECT_EQ(0x0001, fp32_to_fp16(smallest_fp16_denormal).val);
+ EXPECT_EQ(0x0000, fp32_to_fp16(0.5 * smallest_fp16_denormal).val); // Round-to-even.
+ EXPECT_EQ(0x0001, fp32_to_fp16(0.51 * smallest_fp16_denormal).val);
+ EXPECT_EQ(0x0002, fp32_to_fp16(1.5 * smallest_fp16_denormal).val);
+
+ const double smallest_fp16_non_denormal = 6.103515625e-05;
+ EXPECT_EQ(0x0400, fp32_to_fp16(smallest_fp16_non_denormal).val);
+ EXPECT_EQ(0x0400, fp32_to_fp16(smallest_fp16_non_denormal - 0.5 * smallest_fp16_denormal).val); // Round-to-even.
+ EXPECT_EQ(0x03ff, fp32_to_fp16(smallest_fp16_non_denormal - smallest_fp16_denormal).val);