LCOV - code coverage report
Current view: top level - gcc - real.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 100.0 % 9 9
Test Date: 2026-02-28 14:20:25 Functions: 100.0 % 4 4
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Definitions of floating-point access for GNU compiler.
       2              :    Copyright (C) 1989-2026 Free Software Foundation, Inc.
       3              : 
       4              :    This file is part of GCC.
       5              : 
       6              :    GCC is free software; you can redistribute it and/or modify it under
       7              :    the terms of the GNU General Public License as published by the Free
       8              :    Software Foundation; either version 3, or (at your option) any later
       9              :    version.
      10              : 
      11              :    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12              :    WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13              :    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14              :    for more details.
      15              : 
      16              :    You should have received a copy of the GNU General Public License
      17              :    along with GCC; see the file COPYING3.  If not see
      18              :    <http://www.gnu.org/licenses/>.  */
      19              : 
      20              : #ifndef GCC_REAL_H
      21              : #define GCC_REAL_H
      22              : 
      23              : /* An expanded form of the represented number.  */
      24              : 
      25              : /* Enumerate the special cases of numbers that we encounter.  */
      26              : enum real_value_class {
      27              :   rvc_zero,
      28              :   rvc_normal,
      29              :   rvc_inf,
      30              :   rvc_nan
      31              : };
      32              : 
      33              : #define SIGNIFICAND_BITS        (128 + HOST_BITS_PER_LONG)
      34              : #define EXP_BITS                (32 - 6)
      35              : #define MAX_EXP                 ((1 << (EXP_BITS - 1)) - 1)
      36              : #define SIGSZ                   (SIGNIFICAND_BITS / HOST_BITS_PER_LONG)
      37              : #define SIG_MSB                 ((unsigned long)1 << (HOST_BITS_PER_LONG - 1))
      38              : 
      39              : struct GTY(()) real_value {
      40              :   /* Use the same underlying type for all bit-fields, so as to make
      41              :      sure they're packed together, otherwise REAL_VALUE_TYPE_SIZE will
      42              :      be miscomputed.  */
      43              :   unsigned int /* ENUM_BITFIELD (real_value_class) */ cl : 2;
      44              :   /* 1 if number is decimal floating point.  */
      45              :   unsigned int decimal : 1;
      46              :   /* 1 if number is negative.  */
      47              :   unsigned int sign : 1;
      48              :   /* 1 if number is signalling.  */
      49              :   unsigned int signalling : 1;
      50              :   /* 1 if number is canonical
      51              :   All are generally used for handling cases in real.cc.  */
      52              :   unsigned int canonical : 1;
      53              :   /* unbiased exponent of the number.  */
      54              :   unsigned int uexp : EXP_BITS;
      55              :   /* significand of the number.  */
      56              :   unsigned long sig[SIGSZ];
      57              : };
      58              : 
      59              : #define REAL_EXP(REAL) \
      60              :   ((int)((REAL)->uexp ^ (unsigned int)(1 << (EXP_BITS - 1))) \
      61              :    - (1 << (EXP_BITS - 1)))
      62              : #define SET_REAL_EXP(REAL, EXP) \
      63              :   ((REAL)->uexp = ((unsigned int)(EXP) & (unsigned int)((1 << EXP_BITS) - 1)))
      64              : 
      65              : /* Various headers condition prototypes on #ifdef REAL_VALUE_TYPE, so it
      66              :    needs to be a macro.  We do need to continue to have a structure tag
      67              :    so that other headers can forward declare it.  */
      68              : #define REAL_VALUE_TYPE struct real_value
      69              : 
      70              : /* We store a REAL_VALUE_TYPE into an rtx, and we do this by putting it in
      71              :    consecutive "w" slots.  Moreover, we've got to compute the number of "w"
      72              :    slots at preprocessor time, which means we can't use sizeof.  Guess.  */
      73              : 
      74              : #define REAL_VALUE_TYPE_SIZE (SIGNIFICAND_BITS + 32)
      75              : #define REAL_WIDTH \
      76              :   (REAL_VALUE_TYPE_SIZE/HOST_BITS_PER_WIDE_INT \
      77              :    + (REAL_VALUE_TYPE_SIZE%HOST_BITS_PER_WIDE_INT ? 1 : 0)) /* round up */
      78              : 
      79              : /* Verify the guess.  */
      80              : extern char test_real_width
      81              :   [sizeof (REAL_VALUE_TYPE) <= REAL_WIDTH * sizeof (HOST_WIDE_INT) ? 1 : -1];
      82              : 
      83              : /* Calculate the format for CONST_DOUBLE.  We need as many slots as
      84              :    are necessary to overlay a REAL_VALUE_TYPE on them.  This could be
      85              :    as many as four (32-bit HOST_WIDE_INT, 128-bit REAL_VALUE_TYPE).
      86              : 
      87              :    A number of places assume that there are always at least two 'w'
      88              :    slots in a CONST_DOUBLE, so we provide them even if one would suffice.  */
      89              : 
      90              : #if REAL_WIDTH == 1
      91              : # define CONST_DOUBLE_FORMAT     "ww"
      92              : #else
      93              : # if REAL_WIDTH == 2
      94              : #  define CONST_DOUBLE_FORMAT    "ww"
      95              : # else
      96              : #  if REAL_WIDTH == 3
      97              : #   define CONST_DOUBLE_FORMAT   "www"
      98              : #  else
      99              : #   if REAL_WIDTH == 4
     100              : #    define CONST_DOUBLE_FORMAT  "wwww"
     101              : #   else
     102              : #    if REAL_WIDTH == 5
     103              : #     define CONST_DOUBLE_FORMAT "wwwww"
     104              : #    else
     105              : #     if REAL_WIDTH == 6
     106              : #      define CONST_DOUBLE_FORMAT "wwwwww"
     107              : #     else
     108              :        #error "REAL_WIDTH > 6 not supported"
     109              : #     endif
     110              : #    endif
     111              : #   endif
     112              : #  endif
     113              : # endif
     114              : #endif
     115              : 
     116              : 
     117              : /* Describes the properties of the specific target format in use.  */
     118              : struct real_format
     119              : {
     120              :   /* Move to and from the target bytes.  */
     121              :   void (*encode) (const struct real_format *, long *,
     122              :                   const REAL_VALUE_TYPE *);
     123              :   void (*decode) (const struct real_format *, REAL_VALUE_TYPE *,
     124              :                   const long *);
     125              : 
     126              :   /* The radix of the exponent and digits of the significand.  */
     127              :   int b;
     128              : 
     129              :   /* Size of the significand in digits of radix B.  */
     130              :   int p;
     131              : 
     132              :   /* Size of the significant of a NaN, in digits of radix B.  */
     133              :   int pnan;
     134              : 
     135              :   /* The minimum negative integer, x, such that b**(x-1) is normalized.  */
     136              :   int emin;
     137              : 
     138              :   /* The maximum integer, x, such that b**(x-1) is representable.  */
     139              :   int emax;
     140              : 
     141              :   /* The bit position of the sign bit, for determining whether a value
     142              :      is positive/negative, or -1 for a complex encoding.  */
     143              :   int signbit_ro;
     144              : 
     145              :   /* The bit position of the sign bit, for changing the sign of a number,
     146              :      or -1 for a complex encoding.  */
     147              :   int signbit_rw;
     148              : 
     149              :   /* If this is an IEEE interchange format, the number of bits in the
     150              :      format; otherwise, if it is an IEEE extended format, one more
     151              :      than the greatest number of bits in an interchange format it
     152              :      extends; otherwise 0.  Formats need not follow the IEEE 754-2008
     153              :      recommended practice regarding how signaling NaNs are identified,
     154              :      and may vary in the choice of default NaN, but must follow other
     155              :      IEEE practice regarding having NaNs, infinities and subnormal
     156              :      values, and the relation of minimum and maximum exponents, and,
     157              :      for interchange formats, the details of the encoding.  */
     158              :   int ieee_bits;
     159              : 
     160              :   /* Default rounding mode for operations on this format.  */
     161              :   bool round_towards_zero;
     162              :   bool has_sign_dependent_rounding;
     163              : 
     164              :   /* Properties of the format.  */
     165              :   bool has_nans;
     166              :   bool has_inf;
     167              :   bool has_denorm;
     168              :   bool has_signed_zero;
     169              :   bool qnan_msb_set;
     170              :   bool canonical_nan_lsbs_set;
     171              :   const char *name;
     172              : };
     173              : 
     174              : 
     175              : /* The target format used for each floating point mode.
     176              :    Float modes are followed by decimal float modes, with entries for
     177              :    float modes indexed by (MODE - first float mode), and entries for
     178              :    decimal float modes indexed by (MODE - first decimal float mode) +
     179              :    the number of float modes.  */
     180              : extern const struct real_format *
     181              :   real_format_for_mode[NUM_MODE_FLOAT + NUM_MODE_DECIMAL_FLOAT];
     182              : 
     183              : #define REAL_MODE_FORMAT(MODE)                                          \
     184              :   (real_format_for_mode[DECIMAL_FLOAT_MODE_P (MODE)                     \
     185              :                         ? (((MODE) - MIN_MODE_DECIMAL_FLOAT)            \
     186              :                            + NUM_MODE_FLOAT)                            \
     187              :                         : GET_MODE_CLASS (MODE) == MODE_FLOAT           \
     188              :                         ? ((MODE) - MIN_MODE_FLOAT)                     \
     189              :                         : (gcc_unreachable (), 0)])
     190              : 
     191              : #define FLOAT_MODE_FORMAT(MODE) \
     192              :   (REAL_MODE_FORMAT (as_a <scalar_float_mode> (GET_MODE_INNER (MODE))))
     193              : 
     194              : /* The following macro determines whether the floating point format is
     195              :    composite, i.e. may contain non-consecutive mantissa bits, in which
     196              :    case compile-time FP overflow may not model run-time overflow.  */
     197              : #define MODE_COMPOSITE_P(MODE) \
     198              :   (FLOAT_MODE_P (MODE) \
     199              :    && FLOAT_MODE_FORMAT (MODE)->pnan < FLOAT_MODE_FORMAT (MODE)->p)
     200              : 
     201              : /* Accessor macros for format properties.  */
     202              : #define MODE_HAS_NANS(MODE) \
     203              :   (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_nans)
     204              : #define MODE_HAS_INFINITIES(MODE) \
     205              :   (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_inf)
     206              : #define MODE_HAS_SIGNED_ZEROS(MODE) \
     207              :   (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_signed_zero)
     208              : #define MODE_HAS_SIGN_DEPENDENT_ROUNDING(MODE) \
     209              :   (FLOAT_MODE_P (MODE) \
     210              :    && FLOAT_MODE_FORMAT (MODE)->has_sign_dependent_rounding)
     211              : 
     212              : /* This class allows functions in this file to accept a floating-point
     213              :    format as either a mode or an explicit real_format pointer.  In the
     214              :    former case the mode must be VOIDmode (which means "no particular
     215              :    format") or must satisfy SCALAR_FLOAT_MODE_P.  */
     216              : class format_helper
     217              : {
     218              : public:
     219      4326271 :   format_helper (const real_format *format) : m_format (format) {}
     220              :   template<typename T> format_helper (const T &);
     221     68904353 :   const real_format *operator-> () const { return m_format; }
     222      3568137 :   operator const real_format *() const { return m_format; }
     223              : 
     224     33394175 :   bool decimal_p () const { return m_format && m_format->b == 10; }
     225              :   bool can_represent_integral_type_p (tree type) const;
     226              : 
     227              : private:
     228              :   const real_format *m_format;
     229              : };
     230              : 
     231              : template<typename T>
     232     69009977 : inline format_helper::format_helper (const T &m)
     233     69009977 :   : m_format (m == VOIDmode ? 0 : REAL_MODE_FORMAT (m))
     234     69009977 : {}
     235              : 
     236              : /* Declare functions in real.cc.  */
     237              : 
     238              : /* True if the given mode has a NaN representation and the treatment of
     239              :    NaN operands is important.  Certain optimizations, such as folding
     240              :    x * 0 into 0, are not correct for NaN operands, and are normally
     241              :    disabled for modes with NaNs.  The user can ask for them to be
     242              :    done anyway using the -funsafe-math-optimizations switch.  */
     243              : extern bool HONOR_NANS (machine_mode);
     244              : extern bool HONOR_NANS (const_tree);
     245              : extern bool HONOR_NANS (const_rtx);
     246              : 
     247              : /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs).  */
     248              : extern bool HONOR_SNANS (machine_mode);
     249              : extern bool HONOR_SNANS (const_tree);
     250              : extern bool HONOR_SNANS (const_rtx);
     251              : 
     252              : /* As for HONOR_NANS, but true if the mode can represent infinity and
     253              :    the treatment of infinite values is important.  */
     254              : extern bool HONOR_INFINITIES (machine_mode);
     255              : extern bool HONOR_INFINITIES (const_tree);
     256              : extern bool HONOR_INFINITIES (const_rtx);
     257              : 
     258              : /* Like HONOR_NANS, but true if the given mode distinguishes between
     259              :    positive and negative zero, and the sign of zero is important.  */
     260              : extern bool HONOR_SIGNED_ZEROS (machine_mode);
     261              : extern bool HONOR_SIGNED_ZEROS (const_tree);
     262              : extern bool HONOR_SIGNED_ZEROS (const_rtx);
     263              : 
     264              : /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
     265              :    and the rounding mode is important.  */
     266              : extern bool HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode);
     267              : extern bool HONOR_SIGN_DEPENDENT_ROUNDING (const_tree);
     268              : extern bool HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx);
     269              : 
     270              : /* Binary or unary arithmetic on tree_code.  */
     271              : extern bool real_arithmetic (REAL_VALUE_TYPE *, int, const REAL_VALUE_TYPE *,
     272              :                              const REAL_VALUE_TYPE *);
     273              : 
     274              : /* Compare reals by tree_code.  */
     275              : extern bool real_compare (int, const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     276              : 
     277              : /* Determine whether a floating-point value X is infinite.  */
     278              : extern bool real_isinf (const REAL_VALUE_TYPE *);
     279              : 
     280              : /* Determine whether a floating-point value X is infinite with SIGN.  */
     281              : extern bool real_isinf (const REAL_VALUE_TYPE *, bool sign);
     282              : 
     283              : /* Determine whether a floating-point value X is a NaN.  */
     284              : extern bool real_isnan (const REAL_VALUE_TYPE *);
     285              : 
     286              : /* Determine whether a floating-point value X is a signaling NaN.  */
     287              : extern bool real_issignaling_nan (const REAL_VALUE_TYPE *);
     288              : 
     289              : /* Determine whether floating-point value R is a denormal.  This
     290              :    function is only valid for normalized values.  */
     291              : inline bool
     292     13567968 : real_isdenormal (const REAL_VALUE_TYPE *r, machine_mode mode)
     293              : {
     294     13567968 :   return r->cl == rvc_normal && REAL_EXP (r) < REAL_MODE_FORMAT (mode)->emin;
     295              : }
     296              : 
     297              : /* Determine whether a floating-point value X is finite.  */
     298              : extern bool real_isfinite (const REAL_VALUE_TYPE *);
     299              : 
     300              : /* Determine whether a floating-point value X is negative.  */
     301              : extern bool real_isneg (const REAL_VALUE_TYPE *);
     302              : 
     303              : /* Determine whether a floating-point value X is minus zero.  */
     304              : extern bool real_isnegzero (const REAL_VALUE_TYPE *);
     305              : 
     306              : /* Determine whether a floating-point value X is plus or minus zero.  */
     307              : extern bool real_iszero (const REAL_VALUE_TYPE *);
     308              : 
     309              : /* Determine whether a floating-point value X is zero with SIGN.  */
     310              : extern bool real_iszero (const REAL_VALUE_TYPE *, bool sign);
     311              : 
     312              : /* Test relationships between reals.  */
     313              : extern bool real_identical (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     314              : extern bool real_equal (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     315              : extern bool real_less (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     316              : 
     317              : /* Extend or truncate to a new format.  */
     318              : extern void real_convert (REAL_VALUE_TYPE *, format_helper,
     319              :                           const REAL_VALUE_TYPE *);
     320              : 
     321              : /* Return true if truncating to NEW is exact.  */
     322              : extern bool exact_real_truncate (format_helper, const REAL_VALUE_TYPE *);
     323              : 
     324              : /* Render R as a decimal floating point constant.  */
     325              : extern void real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t,
     326              :                              size_t, int);
     327              : 
     328              : /* Render R as a decimal floating point constant, rounded so as to be
     329              :    parsed back to the same value when interpreted in mode MODE.  */
     330              : extern void real_to_decimal_for_mode (char *, const REAL_VALUE_TYPE *, size_t,
     331              :                                       size_t, int, machine_mode);
     332              : 
     333              : /* Render R as a hexadecimal floating point constant.  */
     334              : extern void real_to_hexadecimal (char *, const REAL_VALUE_TYPE *,
     335              :                                  size_t, size_t, int);
     336              : 
     337              : /* Render R as an integer.  */
     338              : extern HOST_WIDE_INT real_to_integer (const REAL_VALUE_TYPE *);
     339              : 
     340              : /* Initialize R from a decimal or hexadecimal string.  Return -1 if
     341              :    the value underflows, +1 if overflows, and 0 otherwise.  */
     342              : extern int real_from_string (REAL_VALUE_TYPE *, const char *);
     343              : /* Wrapper to allow different internal representation for decimal floats. */
     344              : extern void real_from_string3 (REAL_VALUE_TYPE *, const char *, format_helper);
     345              : 
     346              : extern long real_to_target (long *, const REAL_VALUE_TYPE *, format_helper);
     347              : 
     348              : extern void real_from_target (REAL_VALUE_TYPE *, const long *,
     349              :                               format_helper);
     350              : 
     351              : extern void real_inf (REAL_VALUE_TYPE *, bool sign = false);
     352              : 
     353              : extern bool real_nan (REAL_VALUE_TYPE *, const char *, int, format_helper);
     354              : 
     355              : extern void real_maxval (REAL_VALUE_TYPE *, int, machine_mode);
     356              : 
     357              : extern void real_2expN (REAL_VALUE_TYPE *, int, format_helper);
     358              : 
     359              : extern unsigned int real_hash (const REAL_VALUE_TYPE *);
     360              : 
     361              : 
     362              : /* Target formats defined in real.cc.  */
     363              : extern const struct real_format ieee_single_format;
     364              : extern const struct real_format mips_single_format;
     365              : extern const struct real_format motorola_single_format;
     366              : extern const struct real_format spu_single_format;
     367              : extern const struct real_format ieee_double_format;
     368              : extern const struct real_format mips_double_format;
     369              : extern const struct real_format motorola_double_format;
     370              : extern const struct real_format ieee_extended_motorola_format;
     371              : extern const struct real_format ieee_extended_intel_96_format;
     372              : extern const struct real_format ieee_extended_intel_96_round_53_format;
     373              : extern const struct real_format ieee_extended_intel_128_format;
     374              : extern const struct real_format ibm_extended_format;
     375              : extern const struct real_format mips_extended_format;
     376              : extern const struct real_format ieee_quad_format;
     377              : extern const struct real_format mips_quad_format;
     378              : extern const struct real_format vax_f_format;
     379              : extern const struct real_format vax_d_format;
     380              : extern const struct real_format vax_g_format;
     381              : extern const struct real_format real_internal_format;
     382              : extern const struct real_format decimal_single_format;
     383              : extern const struct real_format decimal_double_format;
     384              : extern const struct real_format decimal_quad_format;
     385              : extern const struct real_format ieee_half_format;
     386              : extern const struct real_format arm_half_format;
     387              : extern const struct real_format arm_bfloat_half_format;
     388              : 
     389              : 
     390              : /* ====================================================================== */
     391              : /* Crap.  */
     392              : 
     393              : /* Determine whether a floating-point value X is infinite.  */
     394              : #define REAL_VALUE_ISINF(x)             real_isinf (&(x))
     395              : 
     396              : /* Determine whether a floating-point value X is a NaN.  */
     397              : #define REAL_VALUE_ISNAN(x)             real_isnan (&(x))
     398              : 
     399              : /* Determine whether a floating-point value X is a signaling NaN.  */
     400              : #define REAL_VALUE_ISSIGNALING_NAN(x)  real_issignaling_nan (&(x))
     401              : 
     402              : /* Determine whether a floating-point value X is negative.  */
     403              : #define REAL_VALUE_NEGATIVE(x)          real_isneg (&(x))
     404              : 
     405              : /* Determine whether a floating-point value X is minus zero.  */
     406              : #define REAL_VALUE_MINUS_ZERO(x)        real_isnegzero (&(x))
     407              : 
     408              : /* IN is a REAL_VALUE_TYPE.  OUT is an array of longs.  */
     409              : #define REAL_VALUE_TO_TARGET_LONG_DOUBLE(IN, OUT)                          \
     410              :   real_to_target (OUT, &(IN),                                                  \
     411              :                   float_mode_for_size (TYPE_PRECISION                      \
     412              :                                        (long_double_type_node)).require ())
     413              : 
     414              : #define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT) \
     415              :   real_to_target (OUT, &(IN), float_mode_for_size (64).require ())
     416              : 
     417              : /* IN is a REAL_VALUE_TYPE.  OUT is a long.  */
     418              : #define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) \
     419              :   ((OUT) = real_to_target (NULL, &(IN), float_mode_for_size (32).require ()))
     420              : 
     421              : /* Real values to IEEE 754 decimal floats.  */
     422              : 
     423              : /* IN is a REAL_VALUE_TYPE.  OUT is an array of longs.  */
     424              : #define REAL_VALUE_TO_TARGET_DECIMAL128(IN, OUT) \
     425              :   real_to_target (OUT, &(IN), decimal_float_mode_for_size (128).require ())
     426              : 
     427              : #define REAL_VALUE_TO_TARGET_DECIMAL64(IN, OUT) \
     428              :   real_to_target (OUT, &(IN), decimal_float_mode_for_size (64).require ())
     429              : 
     430              : /* IN is a REAL_VALUE_TYPE.  OUT is a long.  */
     431              : #define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \
     432              :   ((OUT) = real_to_target (NULL, &(IN), \
     433              :                            decimal_float_mode_for_size (32).require ()))
     434              : 
     435              : extern REAL_VALUE_TYPE real_value_truncate (format_helper, REAL_VALUE_TYPE);
     436              : 
     437              : extern REAL_VALUE_TYPE real_value_negate (const REAL_VALUE_TYPE *);
     438              : extern REAL_VALUE_TYPE real_value_abs (const REAL_VALUE_TYPE *);
     439              : 
     440              : extern int significand_size (format_helper);
     441              : 
     442              : extern REAL_VALUE_TYPE real_from_string2 (const char *, format_helper);
     443              : 
     444              : #define REAL_VALUE_ATOF(s, m) \
     445              :   real_from_string2 (s, m)
     446              : 
     447              : #define CONST_DOUBLE_ATOF(s, m) \
     448              :   const_double_from_real_value (real_from_string2 (s, m), m)
     449              : 
     450              : #define REAL_VALUE_FIX(r) \
     451              :   real_to_integer (&(r))
     452              : 
     453              : /* ??? Not quite right.  */
     454              : #define REAL_VALUE_UNSIGNED_FIX(r) \
     455              :   real_to_integer (&(r))
     456              : 
     457              : /* ??? These were added for Paranoia support.  */
     458              : 
     459              : /* Return floor log2(R).  */
     460              : extern int real_exponent (const REAL_VALUE_TYPE *);
     461              : 
     462              : /* R = A * 2**EXP.  */
     463              : extern void real_ldexp (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
     464              : 
     465              : /* **** End of software floating point emulator interface macros **** */
     466              : 
     467              : /* Constant real values 0, 1, 2, -1 and 0.5.  */
     468              : 
     469              : extern REAL_VALUE_TYPE dconst0;
     470              : extern REAL_VALUE_TYPE dconst1;
     471              : extern REAL_VALUE_TYPE dconst2;
     472              : extern REAL_VALUE_TYPE dconstm0;
     473              : extern REAL_VALUE_TYPE dconstm1;
     474              : extern REAL_VALUE_TYPE dconsthalf;
     475              : extern REAL_VALUE_TYPE dconstinf;
     476              : extern REAL_VALUE_TYPE dconstninf;
     477              : 
     478              : #define dconst_e() (*dconst_e_ptr ())
     479              : #define dconst_third() (*dconst_third_ptr ())
     480              : #define dconst_quarter() (*dconst_quarter_ptr ())
     481              : #define dconst_sixth() (*dconst_sixth_ptr ())
     482              : #define dconst_ninth() (*dconst_ninth_ptr ())
     483              : #define dconst_sqrt2() (*dconst_sqrt2_ptr ())
     484              : #define dconst_pi() (*dconst_pi_ptr ())
     485              : 
     486              : /* Function to return the real value special constant 'e'.  */
     487              : extern const REAL_VALUE_TYPE *dconst_e_ptr (void);
     488              : 
     489              : /* Function to return the real value special constant 'pi'.  */
     490              : extern const REAL_VALUE_TYPE *dconst_pi_ptr (void);
     491              : 
     492              : /* Returns a cached REAL_VALUE_TYPE corresponding to 1/n, for various n.  */
     493              : extern const REAL_VALUE_TYPE *dconst_third_ptr (void);
     494              : extern const REAL_VALUE_TYPE *dconst_quarter_ptr (void);
     495              : extern const REAL_VALUE_TYPE *dconst_sixth_ptr (void);
     496              : extern const REAL_VALUE_TYPE *dconst_ninth_ptr (void);
     497              : 
     498              : /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2).  */
     499              : extern const REAL_VALUE_TYPE * dconst_sqrt2_ptr (void);
     500              : 
     501              : /* Function to return a real value (not a tree node)
     502              :    from a given integer constant.  */
     503              : REAL_VALUE_TYPE real_value_from_int_cst (const_tree, const_tree);
     504              : 
     505              : /* Return a CONST_DOUBLE with value R and mode M.  */
     506              : extern rtx const_double_from_real_value (REAL_VALUE_TYPE, machine_mode);
     507              : 
     508              : /* Replace R by 1/R in the given format, if the result is exact.  */
     509              : extern bool exact_real_inverse (format_helper, REAL_VALUE_TYPE *);
     510              : 
     511              : /* Return true if arithmetic on values in IMODE that were promoted
     512              :    from values in TMODE is equivalent to direct arithmetic on values
     513              :    in TMODE.  */
     514              : bool real_can_shorten_arithmetic (machine_mode, machine_mode);
     515              : 
     516              : /* In tree.cc: wrap up a REAL_VALUE_TYPE in a tree node.  */
     517              : extern tree build_real (tree, REAL_VALUE_TYPE);
     518              : 
     519              : /* Likewise, but first truncate the value to the type.  */
     520              : extern tree build_real_truncate (tree, REAL_VALUE_TYPE);
     521              : 
     522              : /* Calculate R as X raised to the integer exponent N in format FMT.  */
     523              : extern bool real_powi (REAL_VALUE_TYPE *, format_helper,
     524              :                        const REAL_VALUE_TYPE *, HOST_WIDE_INT);
     525              : 
     526              : /* Standard round to integer value functions.  */
     527              : extern void real_trunc (REAL_VALUE_TYPE *, format_helper,
     528              :                         const REAL_VALUE_TYPE *);
     529              : extern void real_floor (REAL_VALUE_TYPE *, format_helper,
     530              :                         const REAL_VALUE_TYPE *);
     531              : extern void real_ceil (REAL_VALUE_TYPE *, format_helper,
     532              :                        const REAL_VALUE_TYPE *);
     533              : extern void real_round (REAL_VALUE_TYPE *, format_helper,
     534              :                         const REAL_VALUE_TYPE *);
     535              : extern void real_roundeven (REAL_VALUE_TYPE *, format_helper,
     536              :                             const REAL_VALUE_TYPE *);
     537              : 
     538              : /* Set the sign of R to the sign of X.  */
     539              : extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     540              : 
     541              : /* Check whether the real constant value given is an integer.  */
     542              : extern bool real_isinteger (const REAL_VALUE_TYPE *, format_helper);
     543              : extern bool real_isinteger (const REAL_VALUE_TYPE *, HOST_WIDE_INT *);
     544              : 
     545              : /* Calculate nextafter (X, Y) in format FMT.  */
     546              : extern bool real_nextafter (REAL_VALUE_TYPE *, format_helper,
     547              :                             const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     548              : 
     549              : /* Write into BUF the maximum representable finite floating-point
     550              :    number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
     551              :    float string.  BUF must be large enough to contain the result.  */
     552              : extern void get_max_float (const struct real_format *, char *, size_t, bool);
     553              : 
     554              : #ifndef GENERATOR_FILE
     555              : /* real related routines.  */
     556              : extern wide_int real_to_integer (const REAL_VALUE_TYPE *, bool *, int);
     557              : extern void real_from_integer (REAL_VALUE_TYPE *, format_helper,
     558              :                                const wide_int_ref &, signop);
     559              : #endif
     560              : 
     561              : /* Fills r with the largest value such that 1 + r*r won't overflow.
     562              :    This is used in both sin (atan (x)) and cos (atan(x)) optimizations. */
     563              : extern void build_sinatan_real (REAL_VALUE_TYPE *, tree);
     564              : 
     565              : #endif /* ! GCC_REAL_H */
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.