aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/libgnat/s-powflt.ads
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2020-12-01 07:53:50 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2020-12-17 05:49:22 -0500
commit97919732a8ebeb343705966b2ca649d35d3197e9 (patch)
tree4fca667935c37e1a03a75228d45b48d3ef924a83 /gcc/ada/libgnat/s-powflt.ads
parent5957283fa4958afc18ca718405417d742332d66c (diff)
downloadgcc-97919732a8ebeb343705966b2ca649d35d3197e9.zip
gcc-97919732a8ebeb343705966b2ca649d35d3197e9.tar.gz
gcc-97919732a8ebeb343705966b2ca649d35d3197e9.tar.bz2
[Ada] Do not use exponentiation for common bases in floating-point Value
gcc/ada/ * Makefile.rtl (GNATRTL_NONTASKING_OBJS): Likewise. * exp_imgv.adb (Expand_Value_Attribute): Use RE_Value_Long_Float in lieu of RE_Value_Long_Long_Float as fallback for fixed-point types. Also use it for Long_Long_Float if it has same size as Long_Float. * libgnat/s-imgrea.adb: Replace Powten_Table with Powen_LLF. * libgnat/s-powflt.ads: New file. * libgnat/s-powlfl.ads: Likewise. * libgnat/s-powtab.ads: Rename to... * libgnat/s-powllf.ads: ...this. * libgnat/s-valflt.ads: Add with clause for System.Powten_Flt and pass its table as actual parameter to System.Val_Real. * libgnat/s-vallfl.ads: Likewise for System.Powten_LFlt. * libgnat/s-valllf.ads: Likewise for System.Powten_LLF. * libgnat/s-valrea.ads: Add Maxpow and Powten_Address parameters. * libgnat/s-valrea.adb: Add pragma Warnings (Off). (Need_Extra): New boolean constant. (Precision_Limit): Set it according to Need_Extra. (Impl): Adjust actual parameter. (Integer_to_Rea): Add assertion on the machine radix. Take into account the extra digit only if Need_Extra is true. Reimplement the computation of the final value for bases 2, 4, 8, 10 and 16. * libgnat/s-valued.adb (Impl): Adjust actual parameter. (Scan_Decimal): Add pragma Unreferenced. (Value_Decimal): Likewise. * libgnat/s-valuef.adb (Impl): Adjust actual parameter. * libgnat/s-valuer.ads (Floating): Remove. (Round): New formal parameter. * libgnat/s-valuer.adb (Round_Extra): New procedure. (Scan_Decimal_Digits): Use it to round the extra digit if Round is set to True in the instantiation. (Scan_Integral_Digits): Likewise.
Diffstat (limited to 'gcc/ada/libgnat/s-powflt.ads')
-rw-r--r--gcc/ada/libgnat/s-powflt.ads85
1 files changed, 85 insertions, 0 deletions
diff --git a/gcc/ada/libgnat/s-powflt.ads b/gcc/ada/libgnat/s-powflt.ads
new file mode 100644
index 0000000..9d58967
--- /dev/null
+++ b/gcc/ada/libgnat/s-powflt.ads
@@ -0,0 +1,85 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT COMPILER COMPONENTS --
+-- --
+-- S Y S T E M . P O W T E N _ F L T --
+-- --
+-- S p e c --
+-- --
+-- Copyright (C) 2020, 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- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE. --
+-- --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception, --
+-- version 3.1, as published by the Free Software Foundation. --
+-- --
+-- You should have received a copy of the GNU General Public License and --
+-- a copy of the GCC Runtime Library Exception along with this program; --
+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
+-- <http://www.gnu.org/licenses/>. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+-- This package provides a powers of ten table used for real conversions
+
+package System.Powten_Flt is
+ pragma Pure;
+
+ Maxpow : constant := 38;
+ -- Largest power of ten representable with Float
+
+ Maxpow_Exact : constant := 10;
+ -- Largest power of ten exactly representable with Float. It is equal to
+ -- floor (M * log 2 / log 5), when M is the size of the mantissa (24).
+
+ Powten : constant array (0 .. Maxpow) of Float :=
+ (00 => 1.0E+00,
+ 01 => 1.0E+01,
+ 02 => 1.0E+02,
+ 03 => 1.0E+03,
+ 04 => 1.0E+04,
+ 05 => 1.0E+05,
+ 06 => 1.0E+06,
+ 07 => 1.0E+07,
+ 08 => 1.0E+08,
+ 09 => 1.0E+09,
+ 10 => 1.0E+10,
+ 11 => 1.0E+11,
+ 12 => 1.0E+12,
+ 13 => 1.0E+13,
+ 14 => 1.0E+14,
+ 15 => 1.0E+15,
+ 16 => 1.0E+16,
+ 17 => 1.0E+17,
+ 18 => 1.0E+18,
+ 19 => 1.0E+19,
+ 20 => 1.0E+20,
+ 21 => 1.0E+21,
+ 22 => 1.0E+22,
+ 23 => 1.0E+23,
+ 24 => 1.0E+24,
+ 25 => 1.0E+25,
+ 26 => 1.0E+26,
+ 27 => 1.0E+27,
+ 28 => 1.0E+28,
+ 29 => 1.0E+29,
+ 30 => 1.0E+30,
+ 31 => 1.0E+31,
+ 32 => 1.0E+32,
+ 33 => 1.0E+33,
+ 34 => 1.0E+34,
+ 35 => 1.0E+35,
+ 36 => 1.0E+36,
+ 37 => 1.0E+37,
+ 38 => 1.0E+38);
+
+end System.Powten_Flt;