aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2020-11-22 00:54:18 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2020-12-14 10:51:53 -0500
commitb97b4e6f71da62cae325d1f41610cfb43870a4a1 (patch)
treed952f569405e3fea90909f838af8231515501846
parenta36a291399fbcf24d5ea237850b862921ebdec95 (diff)
downloadgcc-b97b4e6f71da62cae325d1f41610cfb43870a4a1.zip
gcc-b97b4e6f71da62cae325d1f41610cfb43870a4a1.tar.gz
gcc-b97b4e6f71da62cae325d1f41610cfb43870a4a1.tar.bz2
[Ada] Adjust again previous change to System.Fat_Gen
gcc/ada/ * libgnat/s-fatgen.adb: Add with clause for Interfaces and use type clause for Interfaces.Unsigned_64. (Small): Comment out. (Tiny): Likewise. (Tiny16): New integer constant. (Tiny32): Likewise. (Tiny64): Likewise. (Tiny80): New integer array constant. (Pred): Declare a local overlay for Tiny. (Succ): Likewise.
-rw-r--r--gcc/ada/libgnat/s-fatgen.adb32
1 files changed, 29 insertions, 3 deletions
diff --git a/gcc/ada/libgnat/s-fatgen.adb b/gcc/ada/libgnat/s-fatgen.adb
index 64234b4..d297451 100644
--- a/gcc/ada/libgnat/s-fatgen.adb
+++ b/gcc/ada/libgnat/s-fatgen.adb
@@ -35,12 +35,15 @@
-- floating-point implementations.
with Ada.Unchecked_Conversion;
+with Interfaces;
with System.Unsigned_Types;
pragma Warnings (Off, "non-static constant in preelaborated unit");
-- Every constant is static given our instantiation model
package body System.Fat_Gen is
+ use type Interfaces.Unsigned_64;
+
pragma Assert (T'Machine_Radix = 2);
-- This version does not handle radix 16
@@ -53,13 +56,22 @@ package body System.Fat_Gen is
Invrad : constant T := 1.0 / Rad;
-- Smallest positive mantissa in the canonical form (RM A.5.3(4))
- Small : constant T := Rad ** (T'Machine_Emin - 1);
- pragma Unreferenced (Small);
+ -- Small : constant T := Rad ** (T'Machine_Emin - 1);
-- Smallest positive normalized number
- Tiny : constant T := Rad ** (T'Machine_Emin - Mantissa);
+ -- Tiny : constant T := Rad ** (T'Machine_Emin - Mantissa);
-- Smallest positive denormalized number
+ Tiny16 : constant Interfaces.Unsigned_16 := 1;
+ Tiny32 : constant Interfaces.Unsigned_32 := 1;
+ Tiny64 : constant Interfaces.Unsigned_64 := 1;
+ Tiny80 : constant array (1 .. 2) of Interfaces.Unsigned_64 :=
+ (1 * Standard'Default_Bit_Order,
+ 2**48 * (1 - Standard'Default_Bit_Order));
+ -- We cannot use the direct declaration because it cannot be translated
+ -- into C90, as the hexadecimal floating constants were introduced in C99.
+ -- So we work around this by using an overlay of the integer constant.
+
RM1 : constant T := Rad ** (Mantissa - 1);
-- Smallest positive member of the large consecutive integers. It is equal
-- to the ratio Small / Tiny, which means that multiplying by it normalizes
@@ -411,6 +423,13 @@ package body System.Fat_Gen is
----------
function Pred (X : T) return T is
+ Tiny : constant T;
+ pragma Import (Ada, Tiny);
+ for Tiny'Address use (if T'Size = 16 then Tiny16'Address
+ elsif T'Size = 32 then Tiny32'Address
+ elsif T'Size = 64 then Tiny64'Address
+ elsif Mantissa = 64 then Tiny80'Address
+ else raise Program_Error);
X_Frac : T;
X_Exp : UI;
@@ -676,6 +695,13 @@ package body System.Fat_Gen is
----------
function Succ (X : T) return T is
+ Tiny : constant T;
+ pragma Import (Ada, Tiny);
+ for Tiny'Address use (if T'Size = 16 then Tiny16'Address
+ elsif T'Size = 32 then Tiny32'Address
+ elsif T'Size = 64 then Tiny64'Address
+ elsif Mantissa = 64 then Tiny80'Address
+ else raise Program_Error);
X_Frac : T;
X_Exp : UI;