]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/real.h
Remove remaining uses of CONST_DOUBLE_FROM_REAL_VALUE
[thirdparty/gcc.git] / gcc / real.h
CommitLineData
e9a25f70 1/* Definitions of floating-point access for GNU compiler.
5624e564 2 Copyright (C) 1989-2015 Free Software Foundation, Inc.
0694b47c 3
efdc7e19 4 This file is part of GCC.
0694b47c 5
efdc7e19
RH
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
9dcd6f09 8 Software Foundation; either version 3, or (at your option) any later
efdc7e19 9 version.
0694b47c 10
efdc7e19
RH
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.
0694b47c 15
efdc7e19 16 You should have received a copy of the GNU General Public License
9dcd6f09
NC
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
0694b47c 19
88657302
RH
20#ifndef GCC_REAL_H
21#define GCC_REAL_H
0694b47c 22
0ee6fdb5 23/* An expanded form of the represented number. */
ba31d94e 24
0ee6fdb5
RH
25/* Enumerate the special cases of numbers that we encounter. */
26enum real_value_class {
27 rvc_zero,
28 rvc_normal,
29 rvc_inf,
30 rvc_nan
31};
32
ee6ff319 33#define SIGNIFICAND_BITS (128 + HOST_BITS_PER_LONG)
909e2256 34#define EXP_BITS (32 - 6)
0ee6fdb5
RH
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
d1b38208 39struct GTY(()) real_value {
1e92bbb9
AO
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. */
e3a64162 43 unsigned int /* ENUM_BITFIELD (real_value_class) */ cl : 2;
909e2256 44 unsigned int decimal : 1;
0ee6fdb5 45 unsigned int sign : 1;
ad59ba20 46 unsigned int signalling : 1;
fe0002ee 47 unsigned int canonical : 1;
1e92bbb9 48 unsigned int uexp : EXP_BITS;
0ee6fdb5
RH
49 unsigned long sig[SIGSZ];
50};
fd76a739 51
1e92bbb9
AO
52#define REAL_EXP(REAL) \
53 ((int)((REAL)->uexp ^ (unsigned int)(1 << (EXP_BITS - 1))) \
54 - (1 << (EXP_BITS - 1)))
55#define SET_REAL_EXP(REAL, EXP) \
56 ((REAL)->uexp = ((unsigned int)(EXP) & (unsigned int)((1 << EXP_BITS) - 1)))
57
0ee6fdb5
RH
58/* Various headers condition prototypes on #ifdef REAL_VALUE_TYPE, so it
59 needs to be a macro. We do need to continue to have a structure tag
60 so that other headers can forward declare it. */
61#define REAL_VALUE_TYPE struct real_value
62
63/* We store a REAL_VALUE_TYPE into an rtx, and we do this by putting it in
64 consecutive "w" slots. Moreover, we've got to compute the number of "w"
65 slots at preprocessor time, which means we can't use sizeof. Guess. */
66
67#define REAL_VALUE_TYPE_SIZE (SIGNIFICAND_BITS + 32)
46468cd9
ZW
68#define REAL_WIDTH \
69 (REAL_VALUE_TYPE_SIZE/HOST_BITS_PER_WIDE_INT \
70 + (REAL_VALUE_TYPE_SIZE%HOST_BITS_PER_WIDE_INT ? 1 : 0)) /* round up */
efdc7e19 71
0ee6fdb5
RH
72/* Verify the guess. */
73extern char test_real_width
c3284718 74 [sizeof (REAL_VALUE_TYPE) <= REAL_WIDTH * sizeof (HOST_WIDE_INT) ? 1 : -1];
46468cd9
ZW
75
76/* Calculate the format for CONST_DOUBLE. We need as many slots as
77 are necessary to overlay a REAL_VALUE_TYPE on them. This could be
efdc7e19 78 as many as four (32-bit HOST_WIDE_INT, 128-bit REAL_VALUE_TYPE).
46468cd9
ZW
79
80 A number of places assume that there are always at least two 'w'
81 slots in a CONST_DOUBLE, so we provide them even if one would suffice. */
82
83#if REAL_WIDTH == 1
5692c7bc 84# define CONST_DOUBLE_FORMAT "ww"
46468cd9
ZW
85#else
86# if REAL_WIDTH == 2
5692c7bc 87# define CONST_DOUBLE_FORMAT "ww"
46468cd9
ZW
88# else
89# if REAL_WIDTH == 3
5692c7bc 90# define CONST_DOUBLE_FORMAT "www"
46468cd9
ZW
91# else
92# if REAL_WIDTH == 4
5692c7bc 93# define CONST_DOUBLE_FORMAT "wwww"
46468cd9
ZW
94# else
95# if REAL_WIDTH == 5
5692c7bc 96# define CONST_DOUBLE_FORMAT "wwwww"
46468cd9 97# else
ee6ff319
RH
98# if REAL_WIDTH == 6
99# define CONST_DOUBLE_FORMAT "wwwwww"
100# else
101 #error "REAL_WIDTH > 6 not supported"
102# endif
46468cd9
ZW
103# endif
104# endif
105# endif
106# endif
107#endif
fd76a739 108
84f9b8e9 109
3dc85dfb
RH
110/* Describes the properties of the specific target format in use. */
111struct real_format
112{
113 /* Move to and from the target bytes. */
0c20a65f
AJ
114 void (*encode) (const struct real_format *, long *,
115 const REAL_VALUE_TYPE *);
116 void (*decode) (const struct real_format *, REAL_VALUE_TYPE *,
117 const long *);
3dc85dfb
RH
118
119 /* The radix of the exponent and digits of the significand. */
120 int b;
121
3dc85dfb
RH
122 /* Size of the significand in digits of radix B. */
123 int p;
124
fe0002ee
AO
125 /* Size of the significant of a NaN, in digits of radix B. */
126 int pnan;
127
3dc85dfb
RH
128 /* The minimum negative integer, x, such that b**(x-1) is normalized. */
129 int emin;
130
131 /* The maximum integer, x, such that b**(x-1) is representable. */
132 int emax;
133
b87a0206
RS
134 /* The bit position of the sign bit, for determining whether a value
135 is positive/negative, or -1 for a complex encoding. */
136 int signbit_ro;
137
138 /* The bit position of the sign bit, for changing the sign of a number,
139 or -1 for a complex encoding. */
140 int signbit_rw;
4977bab6 141
3e479de3
UW
142 /* Default rounding mode for operations on this format. */
143 bool round_towards_zero;
4099e2c2 144 bool has_sign_dependent_rounding;
3e479de3 145
3dc85dfb
RH
146 /* Properties of the format. */
147 bool has_nans;
148 bool has_inf;
149 bool has_denorm;
150 bool has_signed_zero;
151 bool qnan_msb_set;
58145e4d 152 bool canonical_nan_lsbs_set;
db847fa8 153 const char *name;
3dc85dfb
RH
154};
155
156
909e2256
JG
157/* The target format used for each floating point mode.
158 Float modes are followed by decimal float modes, with entries for
159 float modes indexed by (MODE - first float mode), and entries for
160 decimal float modes indexed by (MODE - first decimal float mode) +
161 the number of float modes. */
0974c7d7 162extern const struct real_format *
909e2256
JG
163 real_format_for_mode[MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1
164 + MAX_MODE_DECIMAL_FLOAT - MIN_MODE_DECIMAL_FLOAT + 1];
3dc85dfb 165
909e2256
JG
166#define REAL_MODE_FORMAT(MODE) \
167 (real_format_for_mode[DECIMAL_FLOAT_MODE_P (MODE) \
4099e2c2 168 ? (((MODE) - MIN_MODE_DECIMAL_FLOAT) \
909e2256 169 + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) \
4099e2c2
UW
170 : ((MODE) - MIN_MODE_FLOAT)])
171
172#define FLOAT_MODE_FORMAT(MODE) \
173 (REAL_MODE_FORMAT (SCALAR_FLOAT_MODE_P (MODE)? (MODE) \
174 : GET_MODE_INNER (MODE)))
3dc85dfb 175
762297d9
RS
176/* The following macro determines whether the floating point format is
177 composite, i.e. may contain non-consecutive mantissa bits, in which
178 case compile-time FP overflow may not model run-time overflow. */
4099e2c2
UW
179#define MODE_COMPOSITE_P(MODE) \
180 (FLOAT_MODE_P (MODE) \
181 && FLOAT_MODE_FORMAT (MODE)->pnan < FLOAT_MODE_FORMAT (MODE)->p)
182
183/* Accessor macros for format properties. */
184#define MODE_HAS_NANS(MODE) \
185 (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_nans)
186#define MODE_HAS_INFINITIES(MODE) \
187 (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_inf)
188#define MODE_HAS_SIGNED_ZEROS(MODE) \
189 (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_signed_zero)
190#define MODE_HAS_SIGN_DEPENDENT_ROUNDING(MODE) \
191 (FLOAT_MODE_P (MODE) \
192 && FLOAT_MODE_FORMAT (MODE)->has_sign_dependent_rounding)
193
3d3dbadd
MG
194/* Declare functions in real.c. */
195
6a4d4e8a
RO
196/* True if the given mode has a NaN representation and the treatment of
197 NaN operands is important. Certain optimizations, such as folding
198 x * 0 into 0, are not correct for NaN operands, and are normally
199 disabled for modes with NaNs. The user can ask for them to be
200 done anyway using the -funsafe-math-optimizations switch. */
1b457aa4
MG
201extern bool HONOR_NANS (machine_mode);
202extern bool HONOR_NANS (const_tree);
203extern bool HONOR_NANS (const_rtx);
6a4d4e8a
RO
204
205/* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs). */
3d3dbadd
MG
206extern bool HONOR_SNANS (machine_mode);
207extern bool HONOR_SNANS (const_tree);
208extern bool HONOR_SNANS (const_rtx);
6a4d4e8a
RO
209
210/* As for HONOR_NANS, but true if the mode can represent infinity and
211 the treatment of infinite values is important. */
3d3dbadd
MG
212extern bool HONOR_INFINITIES (machine_mode);
213extern bool HONOR_INFINITIES (const_tree);
214extern bool HONOR_INFINITIES (const_rtx);
6a4d4e8a
RO
215
216/* Like HONOR_NANS, but true if the given mode distinguishes between
217 positive and negative zero, and the sign of zero is important. */
3d3dbadd
MG
218extern bool HONOR_SIGNED_ZEROS (machine_mode);
219extern bool HONOR_SIGNED_ZEROS (const_tree);
220extern bool HONOR_SIGNED_ZEROS (const_rtx);
6a4d4e8a
RO
221
222/* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
223 and the rounding mode is important. */
3d3dbadd
MG
224extern bool HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode);
225extern bool HONOR_SIGN_DEPENDENT_ROUNDING (const_tree);
226extern bool HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx);
fd76a739 227
efdc7e19 228/* Binary or unary arithmetic on tree_code. */
d284eb28 229extern bool real_arithmetic (REAL_VALUE_TYPE *, int, const REAL_VALUE_TYPE *,
0c20a65f 230 const REAL_VALUE_TYPE *);
efdc7e19
RH
231
232/* Compare reals by tree_code. */
0c20a65f 233extern bool real_compare (int, const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
efdc7e19
RH
234
235/* Determine whether a floating-point value X is infinite. */
0c20a65f 236extern bool real_isinf (const REAL_VALUE_TYPE *);
efdc7e19
RH
237
238/* Determine whether a floating-point value X is a NaN. */
0c20a65f 239extern bool real_isnan (const REAL_VALUE_TYPE *);
efdc7e19 240
4c8c70e0
KG
241/* Determine whether a floating-point value X is finite. */
242extern bool real_isfinite (const REAL_VALUE_TYPE *);
243
efdc7e19 244/* Determine whether a floating-point value X is negative. */
0c20a65f 245extern bool real_isneg (const REAL_VALUE_TYPE *);
efdc7e19
RH
246
247/* Determine whether a floating-point value X is minus zero. */
0c20a65f 248extern bool real_isnegzero (const REAL_VALUE_TYPE *);
efdc7e19 249
624d31fe 250/* Test relationships between reals. */
0c20a65f 251extern bool real_identical (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
624d31fe 252extern bool real_equal (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
8cb41028 253extern bool real_less (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
fd76a739 254
efdc7e19 255/* Extend or truncate to a new mode. */
ef4bddc2 256extern void real_convert (REAL_VALUE_TYPE *, machine_mode,
0c20a65f 257 const REAL_VALUE_TYPE *);
efdc7e19
RH
258
259/* Return true if truncating to NEW is exact. */
ef4bddc2 260extern bool exact_real_truncate (machine_mode, const REAL_VALUE_TYPE *);
efdc7e19
RH
261
262/* Render R as a decimal floating point constant. */
0c20a65f
AJ
263extern void real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t,
264 size_t, int);
efdc7e19 265
3e479de3
UW
266/* Render R as a decimal floating point constant, rounded so as to be
267 parsed back to the same value when interpreted in mode MODE. */
268extern void real_to_decimal_for_mode (char *, const REAL_VALUE_TYPE *, size_t,
ef4bddc2 269 size_t, int, machine_mode);
3e479de3 270
efdc7e19 271/* Render R as a hexadecimal floating point constant. */
0c20a65f
AJ
272extern void real_to_hexadecimal (char *, const REAL_VALUE_TYPE *,
273 size_t, size_t, int);
efdc7e19
RH
274
275/* Render R as an integer. */
0c20a65f 276extern HOST_WIDE_INT real_to_integer (const REAL_VALUE_TYPE *);
efdc7e19 277
92ef5cf9
MLI
278/* Initialize R from a decimal or hexadecimal string. Return -1 if
279 the value underflows, +1 if overflows, and 0 otherwise. */
280extern int real_from_string (REAL_VALUE_TYPE *, const char *);
909e2256 281/* Wrapper to allow different internal representation for decimal floats. */
ef4bddc2 282extern void real_from_string3 (REAL_VALUE_TYPE *, const char *, machine_mode);
efdc7e19 283
0c20a65f
AJ
284extern long real_to_target_fmt (long *, const REAL_VALUE_TYPE *,
285 const struct real_format *);
ef4bddc2 286extern long real_to_target (long *, const REAL_VALUE_TYPE *, machine_mode);
fd76a739 287
0c20a65f
AJ
288extern void real_from_target_fmt (REAL_VALUE_TYPE *, const long *,
289 const struct real_format *);
290extern void real_from_target (REAL_VALUE_TYPE *, const long *,
ef4bddc2 291 machine_mode);
6f4d7222 292
0c20a65f 293extern void real_inf (REAL_VALUE_TYPE *);
fd76a739 294
ef4bddc2 295extern bool real_nan (REAL_VALUE_TYPE *, const char *, int, machine_mode);
efdc7e19 296
ef4bddc2 297extern void real_maxval (REAL_VALUE_TYPE *, int, machine_mode);
18c2511c 298
ef4bddc2 299extern void real_2expN (REAL_VALUE_TYPE *, int, machine_mode);
efdc7e19 300
0c20a65f 301extern unsigned int real_hash (const REAL_VALUE_TYPE *);
46b33600 302
3dc85dfb
RH
303
304/* Target formats defined in real.c. */
305extern const struct real_format ieee_single_format;
fe0002ee 306extern const struct real_format mips_single_format;
b6a9c30c 307extern const struct real_format motorola_single_format;
88f091f5 308extern const struct real_format spu_single_format;
3dc85dfb 309extern const struct real_format ieee_double_format;
fe0002ee 310extern const struct real_format mips_double_format;
b6a9c30c 311extern const struct real_format motorola_double_format;
3dc85dfb
RH
312extern const struct real_format ieee_extended_motorola_format;
313extern const struct real_format ieee_extended_intel_96_format;
bfa0c519 314extern const struct real_format ieee_extended_intel_96_round_53_format;
3dc85dfb 315extern const struct real_format ieee_extended_intel_128_format;
d454e75a 316extern const struct real_format ibm_extended_format;
fe0002ee 317extern const struct real_format mips_extended_format;
3dc85dfb 318extern const struct real_format ieee_quad_format;
fe0002ee 319extern const struct real_format mips_quad_format;
3dc85dfb
RH
320extern const struct real_format vax_f_format;
321extern const struct real_format vax_d_format;
322extern const struct real_format vax_g_format;
5e26e5a2 323extern const struct real_format real_internal_format;
909e2256
JG
324extern const struct real_format decimal_single_format;
325extern const struct real_format decimal_double_format;
326extern const struct real_format decimal_quad_format;
ae63687c
SL
327extern const struct real_format ieee_half_format;
328extern const struct real_format arm_half_format;
3dc85dfb
RH
329
330
efdc7e19
RH
331/* ====================================================================== */
332/* Crap. */
333
ba31d94e 334/* Determine whether a floating-point value X is infinite. */
efdc7e19 335#define REAL_VALUE_ISINF(x) real_isinf (&(x))
ba31d94e
ZW
336
337/* Determine whether a floating-point value X is a NaN. */
efdc7e19 338#define REAL_VALUE_ISNAN(x) real_isnan (&(x))
ba31d94e
ZW
339
340/* Determine whether a floating-point value X is negative. */
efdc7e19 341#define REAL_VALUE_NEGATIVE(x) real_isneg (&(x))
ba31d94e
ZW
342
343/* Determine whether a floating-point value X is minus zero. */
efdc7e19
RH
344#define REAL_VALUE_MINUS_ZERO(x) real_isnegzero (&(x))
345
346/* IN is a REAL_VALUE_TYPE. OUT is an array of longs. */
347#define REAL_VALUE_TO_TARGET_LONG_DOUBLE(IN, OUT) \
348 real_to_target (OUT, &(IN), \
349 mode_for_size (LONG_DOUBLE_TYPE_SIZE, MODE_FLOAT, 0))
fd76a739 350
efdc7e19
RH
351#define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT) \
352 real_to_target (OUT, &(IN), mode_for_size (64, MODE_FLOAT, 0))
91d61207 353
efdc7e19
RH
354/* IN is a REAL_VALUE_TYPE. OUT is a long. */
355#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) \
356 ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_FLOAT, 0)))
91d61207 357
7292b8e4 358/* Real values to IEEE 754 decimal floats. */
909e2256
JG
359
360/* IN is a REAL_VALUE_TYPE. OUT is an array of longs. */
361#define REAL_VALUE_TO_TARGET_DECIMAL128(IN, OUT) \
362 real_to_target (OUT, &(IN), mode_for_size (128, MODE_DECIMAL_FLOAT, 0))
363
364#define REAL_VALUE_TO_TARGET_DECIMAL64(IN, OUT) \
365 real_to_target (OUT, &(IN), mode_for_size (64, MODE_DECIMAL_FLOAT, 0))
366
367/* IN is a REAL_VALUE_TYPE. OUT is a long. */
368#define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \
369 ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_DECIMAL_FLOAT, 0)))
370
ef4bddc2 371extern REAL_VALUE_TYPE real_value_truncate (machine_mode,
0c20a65f 372 REAL_VALUE_TYPE);
efdc7e19 373
d49b6e1e
SB
374extern REAL_VALUE_TYPE real_value_negate (const REAL_VALUE_TYPE *);
375extern REAL_VALUE_TYPE real_value_abs (const REAL_VALUE_TYPE *);
7bb6fbd1 376
ef4bddc2 377extern int significand_size (machine_mode);
7bb6fbd1 378
ef4bddc2 379extern REAL_VALUE_TYPE real_from_string2 (const char *, machine_mode);
7bb5d01e 380
efdc7e19
RH
381#define REAL_VALUE_ATOF(s, m) \
382 real_from_string2 (s, m)
fd76a739 383
efdc7e19 384#define CONST_DOUBLE_ATOF(s, m) \
555affd7 385 const_double_from_real_value (real_from_string2 (s, m), m)
efdc7e19
RH
386
387#define REAL_VALUE_FIX(r) \
388 real_to_integer (&(r))
389
390/* ??? Not quite right. */
391#define REAL_VALUE_UNSIGNED_FIX(r) \
392 real_to_integer (&(r))
393
394/* ??? These were added for Paranoia support. */
395
396/* Return floor log2(R). */
0c20a65f 397extern int real_exponent (const REAL_VALUE_TYPE *);
efdc7e19
RH
398
399/* R = A * 2**EXP. */
0c20a65f 400extern void real_ldexp (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
fd76a739 401
fd76a739 402/* **** End of software floating point emulator interface macros **** */
0694b47c 403\f
aefa9d43 404/* Constant real values 0, 1, 2, -1 and 0.5. */
0694b47c
RS
405
406extern REAL_VALUE_TYPE dconst0;
407extern REAL_VALUE_TYPE dconst1;
408extern REAL_VALUE_TYPE dconst2;
409extern REAL_VALUE_TYPE dconstm1;
03f2ea93 410extern REAL_VALUE_TYPE dconsthalf;
aefa9d43 411
9c02cf68
MLI
412#define dconst_e() (*dconst_e_ptr ())
413#define dconst_third() (*dconst_third_ptr ())
414#define dconst_sqrt2() (*dconst_sqrt2_ptr ())
415
416/* Function to return the real value special constant 'e'. */
417extern const REAL_VALUE_TYPE * dconst_e_ptr (void);
418
419/* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */
420extern const REAL_VALUE_TYPE * dconst_third_ptr (void);
aefa9d43 421
9c02cf68
MLI
422/* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */
423extern const REAL_VALUE_TYPE * dconst_sqrt2_ptr (void);
0694b47c 424
0694b47c
RS
425/* Function to return a real value (not a tree node)
426 from a given integer constant. */
9566a759 427REAL_VALUE_TYPE real_value_from_int_cst (const_tree, const_tree);
0694b47c 428
efdc7e19
RH
429/* Given a CONST_DOUBLE in FROM, store into TO the value it represents. */
430#define REAL_VALUE_FROM_CONST_DOUBLE(to, from) \
9e254451 431 ((to) = *CONST_DOUBLE_REAL_VALUE (from))
0694b47c
RS
432
433/* Return a CONST_DOUBLE with value R and mode M. */
ef4bddc2 434extern rtx const_double_from_real_value (REAL_VALUE_TYPE, machine_mode);
5692c7bc 435
ebc8186b 436/* Replace R by 1/R in the given machine mode, if the result is exact. */
ef4bddc2 437extern bool exact_real_inverse (machine_mode, REAL_VALUE_TYPE *);
ebc8186b 438
20ded7a6
JM
439/* Return true if arithmetic on values in IMODE that were promoted
440 from values in TMODE is equivalent to direct arithmetic on values
441 in TMODE. */
ef4bddc2 442bool real_can_shorten_arithmetic (machine_mode, machine_mode);
20ded7a6 443
11ad4784 444/* In tree.c: wrap up a REAL_VALUE_TYPE in a tree node. */
0c20a65f 445extern tree build_real (tree, REAL_VALUE_TYPE);
11ad4784 446
71c0e7fc 447/* Calculate R as X raised to the integer exponent N in mode MODE. */
ef4bddc2 448extern bool real_powi (REAL_VALUE_TYPE *, machine_mode,
0c20a65f 449 const REAL_VALUE_TYPE *, HOST_WIDE_INT);
e82a312b 450
0a9530a9 451/* Standard round to integer value functions. */
ef4bddc2 452extern void real_trunc (REAL_VALUE_TYPE *, machine_mode,
0c20a65f 453 const REAL_VALUE_TYPE *);
ef4bddc2 454extern void real_floor (REAL_VALUE_TYPE *, machine_mode,
0c20a65f 455 const REAL_VALUE_TYPE *);
ef4bddc2 456extern void real_ceil (REAL_VALUE_TYPE *, machine_mode,
0c20a65f 457 const REAL_VALUE_TYPE *);
ef4bddc2 458extern void real_round (REAL_VALUE_TYPE *, machine_mode,
25348c94 459 const REAL_VALUE_TYPE *);
0a9530a9 460
67057c53
RS
461/* Set the sign of R to the sign of X. */
462extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
463
313f234b 464/* Check whether the real constant value given is an integer. */
ef4bddc2 465extern bool real_isinteger (const REAL_VALUE_TYPE *c, machine_mode mode);
313f234b 466
7faa1bbb
KG
467/* Write into BUF the maximum representable finite floating-point
468 number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
469 float string. BUF must be large enough to contain the result. */
470extern void get_max_float (const struct real_format *, char *, size_t);
807e902e
KZ
471
472#ifndef GENERATOR_FILE
473/* real related routines. */
474extern wide_int real_to_integer (const REAL_VALUE_TYPE *, bool *, int);
ef4bddc2 475extern void real_from_integer (REAL_VALUE_TYPE *, machine_mode,
807e902e
KZ
476 const wide_int_ref &, signop);
477#endif
478
88657302 479#endif /* ! GCC_REAL_H */