Gradual underflow needs to be used for one more exponent.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* libgnat/s-fatgen.adb (Scaling): Fix off-by-one bug for underflow.
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
@@ -784,7 +784,7 @@ package body System.Fat_Gen is
-- Check for gradual underflow
if T'Denorm
- and then Adjustment >= IEEE_Emin - (Mantissa - 1) - Exp
+ and then Adjustment >= IEEE_Emin - Mantissa - Exp
then
Expf := IEEE_Emin;
Expi := Exp + Adjustment - Expf;
@@ -807,6 +807,13 @@ package body System.Fat_Gen is
Float_Word (IEEE_Ebias + Expf) * Exp_Factor;
if Expi < 0 then
+ -- Given that Expi >= -Mantissa, only -64 is problematic
+
+ if Expi = -64 then
+ XX := XX / 2.0;
+ Expi := -63;
+ end if;
+
XX := XX / T (UST.Long_Long_Unsigned (2) ** (-Expi));
end if;