public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-6020] [Ada] Small adjustments to fixed-point I/O units
@ 2020-12-14 15:54 Pierre-Marie de Rodat
0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2020-12-14 15:54 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:951d7d1319923e5188df3224a9f79ee5804bac80
commit r11-6020-g951d7d1319923e5188df3224a9f79ee5804bac80
Author: Eric Botcazou <ebotcazou@adacore.com>
Date: Mon Nov 23 11:39:05 2020 +0100
[Ada] Small adjustments to fixed-point I/O units
gcc/ada/
* libgnat/a-tifiio.adb: Adjust documentation.
(OK_Get_32): Compare the object size of the base type.
(OK_Put_32): Likewise.
(OK_Get_64): Likewise.
(OK_Put_64): Likewise.
* libgnat/a-tifiio__128.adb: Adjust documentation.
(OK_Get_32): Compare the object size of the base type.
(OK_Put_32): Likewise.
(OK_Get_64): Likewise.
(OK_Put_64): Likewise.
(OK_Get_128): Likewise.
(OK_Put_128): Likewise.
* libgnat/a-wtfiio.adb (OK_Get_32): Likewise.
(OK_Put_32): Likewise.
(OK_Get_64): Likewise.
(OK_Put_64): Likewise
* libgnat/a-wtfiio__128.adb (OK_Get_32): Likewise.
(OK_Put_32): Likewise.
(OK_Get_64): Likewise.
(OK_Put_64): Likewise.
(OK_Get_128): Likewise.
(OK_Put_128): Likewise.
* libgnat/a-ztfiio.adb (OK_Get_32): Likewise.
(OK_Put_32): Likewise.
(OK_Get_64): Likewise.
(OK_Put_64): Likewise
* libgnat/a-ztfiio__128.adb (OK_Get_32): Likewise.
(OK_Put_32): Likewise.
(OK_Get_64): Likewise.
(OK_Put_64): Likewise.
(OK_Get_128): Likewise.
(OK_Put_128): Likewise.
Diff:
---
gcc/ada/libgnat/a-tifiio.adb | 35 +++++++++++++++++++++----------
gcc/ada/libgnat/a-tifiio__128.adb | 43 +++++++++++++++++++++++++--------------
gcc/ada/libgnat/a-wtfiio.adb | 8 ++++----
gcc/ada/libgnat/a-wtfiio__128.adb | 12 +++++------
gcc/ada/libgnat/a-ztfiio.adb | 8 ++++----
gcc/ada/libgnat/a-ztfiio__128.adb | 12 +++++------
6 files changed, 72 insertions(+), 46 deletions(-)
diff --git a/gcc/ada/libgnat/a-tifiio.adb b/gcc/ada/libgnat/a-tifiio.adb
index b7d9471873b..61c68ec8ba7 100644
--- a/gcc/ada/libgnat/a-tifiio.adb
+++ b/gcc/ada/libgnat/a-tifiio.adb
@@ -29,8 +29,9 @@
-- --
------------------------------------------------------------------------------
--- Fixed point I/O
--- ---------------
+-- -------------------
+-- - Fixed point I/O -
+-- -------------------
-- The following text documents implementation details of the fixed point
-- input/output routines in the GNAT runtime. The first part describes the
@@ -40,7 +41,7 @@
-- Subsequently these are reduced to implementation constraints and the impact
-- of these constraints on a few possible approaches to input/output is given.
-- Based on this analysis, a specific implementation is selected for use in
--- the GNAT runtime. Finally, the chosen algorithm is analyzed numerically in
+-- the GNAT runtime. Finally the chosen algorithms are analyzed numerically in
-- order to provide user-level documentation on limits for range and precision
-- of fixed point types as well as accuracy of input/output conversions.
@@ -68,7 +69,7 @@
-- Operations
-- ----------
--- 'Image and 'Wide_Image (see RM 3.5(34))
+-- [Wide_[Wide_]]Image attribute (see RM 3.5(27.1/2))
-- These attributes return a decimal real literal best approximating
-- the value (rounded away from zero if halfway between) with a
@@ -88,7 +89,7 @@
-- attributes, although it would be nice to be able to output more
-- than S'Aft digits after the decimal point for values of subtype S.
--- 'Value and 'Wide_Value attribute (RM 3.5(40-55))
+-- [Wide_[Wide_]]Value attribute (RM 3.5(39.1/2))
-- Since the input can be given in any base in the range 2..16,
-- accurate conversion to a fixed point number may require
@@ -121,7 +122,7 @@
-- be less than 2.0**(-53).
-- In GNAT, Fine_Delta is 2.0**(-63), and Duration for example is a 64-bit
--- type. This means that a floating-point type with 63 bits of mantissa needs
+-- type. This means that a floating-point type with 64 bits of mantissa needs
-- to be used, which is only generally available on the x86 architecture. It
-- would still be possible to use multi-precision floating point to perform
-- calculations using longer mantissas, but this is a much harder approach.
@@ -137,9 +138,21 @@
-- Fixed-precision integer arithmetic has the advantage of simplicity and
-- speed. For the most common fixed point types this would be a perfect
--- solution. The downside however may be a too limited set of acceptable
+-- solution. The downside however may be a restricted set of acceptable
-- fixed point types.
+-- Implementation Choices
+-- ----------------------
+
+-- The current implementation in the GNAT runtime uses fixed-precision integer
+-- arithmetic for fixed point types whose Small is the ratio of two integers
+-- whose magnitude is bounded relatively to the size of the mantissa, with a
+-- two-tiered approach for 32-bit and 64-bit fixed point types. For the other
+-- fixed point types, the implementation uses floating-point arithmetic.
+
+-- The exact requirements of the algorithms are analyzed and documented along
+-- with the implementation in their respective units.
+
with Interfaces;
with Ada.Text_IO.Fixed_Aux;
with Ada.Text_IO.Float_Aux;
@@ -171,7 +184,7 @@ package body Ada.Text_IO.Fixed_IO is
-- static (although it is not a static expressions in the RM sense).
OK_Get_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -182,7 +195,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -196,7 +209,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -207,7 +220,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
diff --git a/gcc/ada/libgnat/a-tifiio__128.adb b/gcc/ada/libgnat/a-tifiio__128.adb
index 4dea63ce83b..578beb1fb1c 100644
--- a/gcc/ada/libgnat/a-tifiio__128.adb
+++ b/gcc/ada/libgnat/a-tifiio__128.adb
@@ -29,8 +29,9 @@
-- --
------------------------------------------------------------------------------
--- Fixed point I/O
--- ---------------
+-- -------------------
+-- - Fixed point I/O -
+-- -------------------
-- The following text documents implementation details of the fixed point
-- input/output routines in the GNAT runtime. The first part describes the
@@ -40,7 +41,7 @@
-- Subsequently these are reduced to implementation constraints and the impact
-- of these constraints on a few possible approaches to input/output is given.
-- Based on this analysis, a specific implementation is selected for use in
--- the GNAT runtime. Finally, the chosen algorithm is analyzed numerically in
+-- the GNAT runtime. Finally the chosen algorithms are analyzed numerically in
-- order to provide user-level documentation on limits for range and precision
-- of fixed point types as well as accuracy of input/output conversions.
@@ -68,7 +69,7 @@
-- Operations
-- ----------
--- 'Image and 'Wide_Image (see RM 3.5(34))
+-- [Wide_[Wide_]]Image attribute (see RM 3.5(27.1/2))
-- These attributes return a decimal real literal best approximating
-- the value (rounded away from zero if halfway between) with a
@@ -88,7 +89,7 @@
-- attributes, although it would be nice to be able to output more
-- than S'Aft digits after the decimal point for values of subtype S.
--- 'Value and 'Wide_Value attribute (RM 3.5(40-55))
+-- [Wide_[Wide_]]Value attribute (RM 3.5(39.1/2))
-- Since the input can be given in any base in the range 2..16,
-- accurate conversion to a fixed point number may require
@@ -120,9 +121,9 @@
-- available has 53 bits of mantissa. This means that Fine_Delta cannot
-- be less than 2.0**(-53).
--- In GNAT, Fine_Delta is 2.0**(-63), and Duration for example is a 64-bit
--- type. This means that a floating-point type with 63 bits of mantissa needs
--- to be used, which is only generally available on the x86 architecture. It
+-- In GNAT, Fine_Delta is 2.0**(-127), and Duration for example is a 64-bit
+-- type. This means that a floating-point type with 128 bits of mantissa needs
+-- to be used, which currently does not exist in any common architecture. It
-- would still be possible to use multi-precision floating point to perform
-- calculations using longer mantissas, but this is a much harder approach.
@@ -137,9 +138,21 @@
-- Fixed-precision integer arithmetic has the advantage of simplicity and
-- speed. For the most common fixed point types this would be a perfect
--- solution. The downside however may be a too limited set of acceptable
+-- solution. The downside however may be a restricted set of acceptable
-- fixed point types.
+-- Implementation Choices
+-- ----------------------
+
+-- The current implementation in the GNAT runtime uses fixed-precision integer
+-- arithmetic for fixed point types whose Small is the ratio of two integers
+-- whose magnitude is bounded relatively to the size of the mantissa, with a
+-- three-tiered approach for 32-bit, 64-bit and 128-bit fixed point types. For
+-- other fixed point types, the implementation uses floating-point arithmetic.
+
+-- The exact requirements of the algorithms are analyzed and documented along
+-- with the implementation in their respective units.
+
with Interfaces;
with Ada.Text_IO.Fixed_Aux;
with Ada.Text_IO.Float_Aux;
@@ -178,7 +191,7 @@ package body Ada.Text_IO.Fixed_IO is
-- in the RM sense).
OK_Get_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -189,7 +202,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -203,7 +216,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -214,7 +227,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -228,7 +241,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_128 : constant Boolean :=
- Num'Object_Size <= 128
+ Num'Base'Object_Size <= 128
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**127)
or else
@@ -239,7 +252,7 @@ package body Ada.Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_128 : constant Boolean :=
- Num'Object_Size <= 128
+ Num'Base'Object_Size <= 128
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**127)
or else
diff --git a/gcc/ada/libgnat/a-wtfiio.adb b/gcc/ada/libgnat/a-wtfiio.adb
index fa9c1e08c08..570c5da72d8 100644
--- a/gcc/ada/libgnat/a-wtfiio.adb
+++ b/gcc/ada/libgnat/a-wtfiio.adb
@@ -62,7 +62,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- static (although it is not a static expressions in the RM sense).
OK_Get_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -73,7 +73,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -87,7 +87,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -98,7 +98,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
diff --git a/gcc/ada/libgnat/a-wtfiio__128.adb b/gcc/ada/libgnat/a-wtfiio__128.adb
index 846c036dd03..aa45e5d375d 100644
--- a/gcc/ada/libgnat/a-wtfiio__128.adb
+++ b/gcc/ada/libgnat/a-wtfiio__128.adb
@@ -69,7 +69,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- in the RM sense).
OK_Get_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -80,7 +80,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -94,7 +94,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -105,7 +105,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -119,7 +119,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_128 : constant Boolean :=
- Num'Object_Size <= 128
+ Num'Base'Object_Size <= 128
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**127)
or else
@@ -130,7 +130,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_128 : constant Boolean :=
- Num'Object_Size <= 128
+ Num'Base'Object_Size <= 128
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**127)
or else
diff --git a/gcc/ada/libgnat/a-ztfiio.adb b/gcc/ada/libgnat/a-ztfiio.adb
index 57b258e0af5..3c3224d3c57 100644
--- a/gcc/ada/libgnat/a-ztfiio.adb
+++ b/gcc/ada/libgnat/a-ztfiio.adb
@@ -62,7 +62,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- static (although it is not a static expressions in the RM sense).
OK_Get_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -73,7 +73,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -87,7 +87,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -98,7 +98,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
diff --git a/gcc/ada/libgnat/a-ztfiio__128.adb b/gcc/ada/libgnat/a-ztfiio__128.adb
index fcb7077d1ef..3254fb8c7de 100644
--- a/gcc/ada/libgnat/a-ztfiio__128.adb
+++ b/gcc/ada/libgnat/a-ztfiio__128.adb
@@ -70,7 +70,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- in the RM sense).
OK_Get_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -81,7 +81,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_32 : constant Boolean :=
- Num'Object_Size <= 32
+ Num'Base'Object_Size <= 32
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**31)
or else
@@ -95,7 +95,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -106,7 +106,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_64 : constant Boolean :=
- Num'Object_Size <= 64
+ Num'Base'Object_Size <= 64
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**63)
or else
@@ -120,7 +120,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Image_F
OK_Get_128 : constant Boolean :=
- Num'Object_Size <= 128
+ Num'Base'Object_Size <= 128
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**127)
or else
@@ -131,7 +131,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
-- These conditions are derived from the prerequisites of System.Value_F
OK_Put_128 : constant Boolean :=
- Num'Object_Size <= 128
+ Num'Base'Object_Size <= 128
and then
((Num'Small_Numerator = 1 and then Num'Small_Denominator <= 2**127)
or else
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-12-14 15:54 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-14 15:54 [gcc r11-6020] [Ada] Small adjustments to fixed-point I/O units Pierre-Marie de Rodat
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).