diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2020-12-01 07:53:50 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-12-17 05:49:22 -0500 |
commit | 97919732a8ebeb343705966b2ca649d35d3197e9 (patch) | |
tree | 4fca667935c37e1a03a75228d45b48d3ef924a83 /gcc/ada/libgnat/s-powflt.ads | |
parent | 5957283fa4958afc18ca718405417d742332d66c (diff) | |
download | gcc-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.ads | 85 |
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; |