From: Robert Dewar Date: Mon, 4 Aug 2014 08:09:31 +0000 (+0000) Subject: s-imgrea.adb (Image_Floating_Point): Don't add space before +Inf. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8616baee3a59d28336a2012b539fad1f720cc4dc;p=gcc.git s-imgrea.adb (Image_Floating_Point): Don't add space before +Inf. 2014-08-04 Robert Dewar * s-imgrea.adb (Image_Floating_Point): Don't add space before +Inf. * s-fatgen.adb (Pred): Handle Float'First. (Succ): Handle Float'Last. From-SVN: r213539 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index b797f135baf..985c915be82 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2014-08-04 Robert Dewar + + * s-imgrea.adb (Image_Floating_Point): Don't add space before +Inf. + * s-fatgen.adb (Pred): Handle Float'First. + (Succ): Handle Float'Last. + 2014-08-04 Ed Schonberg * sem_util.adb (Is_Potentially_Unevaluated): If the original diff --git a/gcc/ada/s-fatgen.adb b/gcc/ada/s-fatgen.adb index 01bb2b44a97..be564cf6a0e 100644 --- a/gcc/ada/s-fatgen.adb +++ b/gcc/ada/s-fatgen.adb @@ -401,22 +401,37 @@ package body System.Fat_Gen is -- Pred -- ---------- - -- Subtract from the given number a number equivalent to the value of its - -- least significant bit. Given that the most significant bit represents - -- a value of 1.0 * radix ** (exp - 1), the value we want is obtained by - -- shifting this by (mantissa-1) bits to the right, i.e. decreasing the - -- exponent by that amount. - - -- Zero has to be treated specially, since its exponent is zero - function Pred (X : T) return T is X_Frac : T; X_Exp : UI; begin + -- Zero has to be treated specially, since its exponent is zero + if X = 0.0 then return -Succ (X); + -- Special treatment for most negative number + + elsif X = T'First then + + -- If not generating infinities, we raise a constraint error + + if T'Machine_Overflows then + raise Constraint_Error with "Pred of largest negative number"; + + -- Otherwise generate a negative infinity + + else + return X / (X - X); + end if; + + -- Subtract from the given number a number equivalent to the value + -- of its least significant bit. Given that the most significant bit + -- represents a value of 1.0 * radix ** (exp - 1), the value we want + -- is obtained by shifting this by (mantissa-1) bits to the right, + -- i.e. decreasing the exponent by that amount. + else Decompose (X, X_Frac, X_Exp); @@ -624,17 +639,14 @@ package body System.Fat_Gen is -- Succ -- ---------- - -- Similar computation to that of Pred: find value of least significant - -- bit of given number, and add. Zero has to be treated specially since - -- the exponent can be zero, and also we want the smallest denormal if - -- denormals are supported. - function Succ (X : T) return T is X_Frac : T; X_Exp : UI; X1, X2 : T; begin + -- Treat zero specially since it has a zero exponent + if X = 0.0 then X1 := 2.0 ** T'Machine_Emin; @@ -648,6 +660,27 @@ package body System.Fat_Gen is return X1; + -- Special treatment for largest positive number + + elsif X = T'Last then + + -- If not generating infinities, we raise a constraint error + + if T'Machine_Overflows then + raise Constraint_Error with "Succ of largest negative number"; + + -- Otherwise generate a positive infinity + + else + return X / (X - X); + end if; + + -- Add to the given number a number equivalent to the value + -- of its least significant bit. Given that the most significant bit + -- represents a value of 1.0 * radix ** (exp - 1), the value we want + -- is obtained by shifting this by (mantissa-1) bits to the right, + -- i.e. decreasing the exponent by that amount. + else Decompose (X, X_Frac, X_Exp); diff --git a/gcc/ada/s-imgrea.adb b/gcc/ada/s-imgrea.adb index fcfd107dd03..075a5774000 100644 --- a/gcc/ada/s-imgrea.adb +++ b/gcc/ada/s-imgrea.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2014, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -93,9 +93,10 @@ package body System.Img_Real is -- output of -0.0 on targets where this is the case). We can of -- course still see a -0.0 on a target where Signed_Zeroes is -- False (since this attribute refers to the proper handling of - -- negative zeroes, not to their existence). + -- negative zeroes, not to their existence). We do not generate + -- a blank for positive infinity, since we output an explicit +. - if not Is_Negative (V) + if (not Is_Negative (V) and then V <= Long_Long_Float'Last) or else (not Long_Long_Float'Signed_Zeros and then V = -0.0) then S (1) := ' ';