From a644c3d835a4011d8d05454d061f391603df7bc1 Mon Sep 17 00:00:00 2001 From: Ben Clayton Date: Thu, 26 May 2022 17:40:15 +0000 Subject: [PATCH] tint/reader/wgsl: Use C++17 hex floats for tests C++17 supports hex float literals. Use these to simplifty the test expectations. Bug: tint:1504 Change-Id: Id47b0963da93f3b5da261c72fe863e791c16af1f Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/91427 Reviewed-by: David Neto Commit-Queue: Ben Clayton --- .../wgsl/parser_impl_const_literal_test.cc | 182 ++++++++---------- 1 file changed, 81 insertions(+), 101 deletions(-) diff --git a/src/tint/reader/wgsl/parser_impl_const_literal_test.cc b/src/tint/reader/wgsl/parser_impl_const_literal_test.cc index cc0f22a84f..5d882cae89 100644 --- a/src/tint/reader/wgsl/parser_impl_const_literal_test.cc +++ b/src/tint/reader/wgsl/parser_impl_const_literal_test.cc @@ -14,7 +14,6 @@ #include "src/tint/reader/wgsl/parser_impl_test_helper.h" -#include #include #include "gmock/gmock.h" @@ -22,25 +21,6 @@ namespace tint::reader::wgsl { namespace { -// Makes an IEEE 754 binary32 floating point number with -// - 0 sign if sign is 0, 1 otherwise -// - 'exponent_bits' is placed in the exponent space. -// So, the exponent bias must already be included. -float MakeFloat(uint32_t sign, uint32_t biased_exponent, uint32_t mantissa) { - const uint32_t sign_bit = sign ? 0x80000000u : 0u; - // The binary32 exponent is 8 bits, just below the sign. - const uint32_t exponent_bits = (biased_exponent & 0xffu) << 23; - // The mantissa is the bottom 23 bits. - const uint32_t mantissa_bits = (mantissa & 0x7fffffu); - - uint32_t bits = sign_bit | exponent_bits | mantissa_bits; - float result = 0.0f; - static_assert(sizeof(result) == sizeof(bits), - "expected float and uint32_t to be the same size"); - std::memcpy(&result, &bits, sizeof(bits)); - return result; -} - // Makes an IEEE 754 binary64 floating point number with // - 0 sign if sign is 0, 1 otherwise // - 'exponent_bits' is placed in the exponent space. @@ -263,106 +243,106 @@ const double PosInf = MakeDouble(0, 0x7FF, 0); FloatLiteralTestCaseList HexFloatCases() { return FloatLiteralTestCaseList{ // Regular numbers - {"0x0p+0", 0.0}, - {"0x1p+0", 1.0}, - {"0x1p+1", 2.0}, - {"0x1.8p+1", 3.0}, - {"0x1.99999ap-4", 0.10000000149011612}, - {"0x1p-1", 0.5}, - {"0x1p-2", 0.25}, - {"0x1.8p-1", 0.75}, - {"-0x0p+0", -0.0}, - {"-0x1p+0", -1.0}, - {"-0x1p-1", -0.5}, - {"-0x1p-2", -0.25}, - {"-0x1.8p-1", -0.75}, + {"0x0p+0", 0x0p+0}, + {"0x1p+0", 0x1p+0}, + {"0x1p+1", 0x1p+1}, + {"0x1.8p+1", 0x1.8p+1}, + {"0x1.99999ap-4", 0x1.99999ap-4}, + {"0x1p-1", 0x1p-1}, + {"0x1p-2", 0x1p-2}, + {"0x1.8p-1", 0x1.8p-1}, + {"-0x0p+0", -0x0p+0}, + {"-0x1p+0", -0x1p+0}, + {"-0x1p-1", -0x1p-1}, + {"-0x1p-2", -0x1p-2}, + {"-0x1.8p-1", -0x1.8p-1}, // Large numbers - {"0x1p+9", 512.0}, - {"0x1p+10", 1024.0}, - {"0x1.02p+10", 1024.0 + 8.0}, - {"-0x1p+9", -512.0}, - {"-0x1p+10", -1024.0}, - {"-0x1.02p+10", -1024.0 - 8.0}, + {"0x1p+9", 0x1p+9}, + {"0x1p+10", 0x1p+10}, + {"0x1.02p+10", 0x1.02p+10}, + {"-0x1p+9", -0x1p+9}, + {"-0x1p+10", -0x1p+10}, + {"-0x1.02p+10", -0x1.02p+10}, // Small numbers - {"0x1p-9", 1.0 / 512.0}, - {"0x1p-10", 1.0 / 1024.0}, - {"0x1.02p-3", 1.0 / 1024.0 + 1.0 / 8.0}, - {"-0x1p-9", 1.0 / -512.0}, - {"-0x1p-10", 1.0 / -1024.0}, - {"-0x1.02p-3", 1.0 / -1024.0 - 1.0 / 8.0}, + {"0x1p-9", 0x1p-9}, + {"0x1p-10", 0x1p-10}, + {"0x1.02p-3", 0x1.02p-3}, + {"-0x1p-9", -0x1p-9}, + {"-0x1p-10", -0x1p-10}, + {"-0x1.02p-3", -0x1.02p-3}, // Near lowest non-denorm - {"0x1p-1020", std::ldexp(1.0 * 8.0, -1023)}, - {"0x1p-1021", std::ldexp(1.0 * 4.0, -1023)}, - {"-0x1p-1020", -std::ldexp(1.0 * 8.0, -1023)}, - {"-0x1p-1021", -std::ldexp(1.0 * 4.0, -1023)}, + {"0x1p-1020", 0x1p-1020}, + {"0x1p-1021", 0x1p-1021}, + {"-0x1p-1020", -0x1p-1020}, + {"-0x1p-1021", -0x1p-1021}, - {"0x1p-124f", std::ldexp(1.0 * 8.0, -127)}, - {"0x1p-125f", std::ldexp(1.0 * 4.0, -127)}, - {"-0x1p-124f", -std::ldexp(1.0 * 8.0, -127)}, - {"-0x1p-125f", -std::ldexp(1.0 * 4.0, -127)}, + {"0x1p-124f", 0x1p-124}, + {"0x1p-125f", 0x1p-125}, + {"-0x1p-124f", -0x1p-124}, + {"-0x1p-125f", -0x1p-125}, // Lowest non-denorm - {"0x1p-1022", std::ldexp(1.0 * 2.0, -1023)}, - {"-0x1p-1022", -std::ldexp(1.0 * 2.0, -1023)}, + {"0x1p-1022", 0x1p-1022}, + {"-0x1p-1022", -0x1p-1022}, - {"0x1p-126f", std::ldexp(1.0 * 2.0, -127)}, - {"-0x1p-126f", -std::ldexp(1.0 * 2.0, -127)}, + {"0x1p-126f", 0x1p-126}, + {"-0x1p-126f", -0x1p-126}, // Denormalized values - {"0x1p-1023", std::ldexp(1.0, -1023)}, - {"0x1p-1024", std::ldexp(1.0 / 2.0, -1023)}, - {"0x1p-1025", std::ldexp(1.0 / 4.0, -1023)}, - {"0x1p-1026", std::ldexp(1.0 / 8.0, -1023)}, - {"-0x1p-1023", -std::ldexp(1.0, -1023)}, - {"-0x1p-1024", -std::ldexp(1.0 / 2.0, -1023)}, - {"-0x1p-1025", -std::ldexp(1.0 / 4.0, -1023)}, - {"-0x1p-1026", -std::ldexp(1.0 / 8.0, -1023)}, - {"0x1.8p-1023", std::ldexp(1.0, -1023) + (std::ldexp(1.0, -1023) / 2.0)}, - {"0x1.8p-1024", std::ldexp(1.0, -1023) / 2.0 + (std::ldexp(1.0, -1023) / 4.0)}, + {"0x1p-1023", 0x1p-1023}, + {"0x1p-1024", 0x1p-1024}, + {"0x1p-1025", 0x1p-1025}, + {"0x1p-1026", 0x1p-1026}, + {"-0x1p-1023", -0x1p-1023}, + {"-0x1p-1024", -0x1p-1024}, + {"-0x1p-1025", -0x1p-1025}, + {"-0x1p-1026", -0x1p-1026}, + {"0x1.8p-1023", 0x1.8p-1023}, + {"0x1.8p-1024", 0x1.8p-1024}, - {"0x1p-127f", std::ldexp(1.0, -127)}, - {"0x1p-128f", std::ldexp(1.0 / 2.0, -127)}, - {"0x1p-129f", std::ldexp(1.0 / 4.0, -127)}, - {"0x1p-130f", std::ldexp(1.0 / 8.0, -127)}, - {"-0x1p-127f", -std::ldexp(1.0, -127)}, - {"-0x1p-128f", -std::ldexp(1.0 / 2.0, -127)}, - {"-0x1p-129f", -std::ldexp(1.0 / 4.0, -127)}, - {"-0x1p-130f", -std::ldexp(1.0 / 8.0, -127)}, - {"0x1.8p-127f", std::ldexp(1.0, -127) + (std::ldexp(1.0, -127) / 2.0)}, - {"0x1.8p-128f", std::ldexp(1.0, -127) / 2.0 + (std::ldexp(1.0, -127) / 4.0)}, + {"0x1p-127f", 0x1p-127}, + {"0x1p-128f", 0x1p-128}, + {"0x1p-129f", 0x1p-129}, + {"0x1p-130f", 0x1p-130}, + {"-0x1p-127f", -0x1p-127}, + {"-0x1p-128f", -0x1p-128}, + {"-0x1p-129f", -0x1p-129}, + {"-0x1p-130f", -0x1p-130}, + {"0x1.8p-127f", 0x1.8p-127}, + {"0x1.8p-128f", 0x1.8p-128}, // F64 extremities - {"0x1p-1074", MakeDouble(0, 0, 1)}, // +SmallestDenormal - {"0x1p-1073", MakeDouble(0, 0, 2)}, // +BiggerDenormal - {"0x1.ffffffffffffp-1027", MakeDouble(0, 0, 0xffffffffffff)}, // +LargestDenormal - {"-0x1p-1074", MakeDouble(1, 0, 1)}, // -SmallestDenormal - {"-0x1p-1073", MakeDouble(1, 0, 2)}, // -BiggerDenormal - {"-0x1.ffffffffffffp-1027", MakeDouble(1, 0, 0xffffffffffff)}, // -LargestDenormal + {"0x1p-1074", 0x1p-1074}, // +SmallestDenormal + {"0x1p-1073", 0x1p-1073}, // +BiggerDenormal + {"0x1.ffffffffffffp-1027", 0x1.ffffffffffffp-1027}, // +LargestDenormal + {"-0x1p-1074", -0x1p-1074}, // -SmallestDenormal + {"-0x1p-1073", -0x1p-1073}, // -BiggerDenormal + {"-0x1.ffffffffffffp-1027", -0x1.ffffffffffffp-1027}, // -LargestDenormal - {"0x0.cafebeeff000dp-1022", MakeDouble(0, 0, 0xcafebeeff000d)}, // +Subnormal - {"-0x0.cafebeeff000dp-1022", MakeDouble(1, 0, 0xcafebeeff000d)}, // -Subnormal - {"0x1.2bfaf8p-1052", MakeDouble(0, 0, 0x4afebe)}, // +Subnormal - {"-0x1.2bfaf8p-1052", MakeDouble(1, 0, 0x4afebe)}, // +Subnormal - {"0x1.55554p-1055", MakeDouble(0, 0, 0xaaaaa)}, // +Subnormal - {"-0x1.55554p-1055", MakeDouble(1, 0, 0xaaaaa)}, // -Subnormal + {"0x0.cafebeeff000dp-1022", 0x0.cafebeeff000dp-1022}, // +Subnormal + {"-0x0.cafebeeff000dp-1022", -0x0.cafebeeff000dp-1022}, // -Subnormal + {"0x1.2bfaf8p-1052", 0x1.2bfaf8p-1052}, // +Subnormal + {"-0x1.2bfaf8p-1052", -0x1.2bfaf8p-1052}, // +Subnormal + {"0x1.55554p-1055", 0x1.55554p-1055}, // +Subnormal + {"-0x1.55554p-1055", -0x1.55554p-1055}, // -Subnormal // F32 extremities - {"0x1p-149", static_cast(MakeFloat(0, 0, 1))}, // +SmallestDenormal - {"0x1p-148", static_cast(MakeFloat(0, 0, 2))}, // +BiggerDenormal - {"0x1.fffffcp-127", static_cast(MakeFloat(0, 0, 0x7fffff))}, // +LargestDenormal - {"-0x1p-149", static_cast(MakeFloat(1, 0, 1))}, // -SmallestDenormal - {"-0x1p-148", static_cast(MakeFloat(1, 0, 2))}, // -BiggerDenormal - {"-0x1.fffffcp-127", static_cast(MakeFloat(1, 0, 0x7fffff))}, // -LargestDenormal + {"0x1p-149", 0x1p-149}, // +SmallestDenormal + {"0x1p-148", 0x1p-148}, // +BiggerDenormal + {"0x1.fffffcp-127", 0x1.fffffcp-127}, // +LargestDenormal + {"-0x1p-149", -0x1p-149}, // -SmallestDenormal + {"-0x1p-148", -0x1p-148}, // -BiggerDenormal + {"-0x1.fffffcp-127", -0x1.fffffcp-127}, // -LargestDenormal - {"0x0.cafebp-129", static_cast(MakeFloat(0, 0, 0xcafeb))}, // +Subnormal - {"-0x0.cafebp-129", static_cast(MakeFloat(1, 0, 0xcafeb))}, // -Subnormal - {"0x1.2bfaf8p-127", static_cast(MakeFloat(0, 0, 0x4afebe))}, // +Subnormal - {"-0x1.2bfaf8p-127", static_cast(MakeFloat(1, 0, 0x4afebe))}, // -Subnormal - {"0x1.55554p-130", static_cast(MakeFloat(0, 0, 0xaaaaa))}, // +Subnormal - {"-0x1.55554p-130", static_cast(MakeFloat(1, 0, 0xaaaaa))}, // -Subnormal + {"0x0.cafebp-129", 0x0.cafebp-129}, // +Subnormal + {"-0x0.cafebp-129", -0x0.cafebp-129}, // -Subnormal + {"0x1.2bfaf8p-127", 0x1.2bfaf8p-127}, // +Subnormal + {"-0x1.2bfaf8p-127", -0x1.2bfaf8p-127}, // -Subnormal + {"0x1.55554p-130", 0x1.55554p-130}, // +Subnormal + {"-0x1.55554p-130", -0x1.55554p-130}, // -Subnormal // Underflow -> Zero {"0x1p-1074", 0.0}, // Exponent underflows