[Ada] Make new implementation of System.Fat_Gen.Valid more robust

Message ID 20210506075812.GA125549@adacore.com
State New
Headers show
Series
  • [Ada] Make new implementation of System.Fat_Gen.Valid more robust
Related show

Commit Message

Pierre-Marie de Rodat May 6, 2021, 7:58 a.m.
The comparison of any denormalized number with 0.0 may return True on
hardware not supporting denormals, so we need to do a bit comparison.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* libgnat/s-fatgen.adb (Valid): Do a bit comparison with 0.0
	when denormalized numbers are not supported.

Patch

diff --git a/gcc/ada/libgnat/s-fatgen.adb b/gcc/ada/libgnat/s-fatgen.adb
--- a/gcc/ada/libgnat/s-fatgen.adb
+++ b/gcc/ada/libgnat/s-fatgen.adb
@@ -959,7 +959,19 @@  package body System.Fat_Gen is
       else pragma Assert (Exp = IEEE_Emin - 1);
          --  This is a denormalized number, valid if T'Denorm is True or 0.0
 
-         return T'Denorm or else X.all = 0.0;
+         if T'Denorm then
+            return True;
+
+         --  Note that we cannot do a direct comparison with 0.0 because the
+         --  hardware may evaluate it to True for all denormalized numbers.
+
+         else
+            --  First clear the sign bit (the exponent is already zero)
+
+            Rep (MSW) := Rep (MSW) and not Sign_Mask;
+
+            return (for all J in 0 .. Rep_Last => Rep (J) = 0);
+         end if;
       end if;
    end Valid;