summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/s-fatgen.adb59
-rw-r--r--gcc/ada/s-imgrea.adb7
3 files changed, 56 insertions, 16 deletions
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 <dewar@adacore.com>
+
+ * 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 <schonberg@adacore.com>
* 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) := ' ';