00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_REAL_H
00023 #define GCC_REAL_H
00024
00025 #include "machmode.h"
00026
00027
00028
00029
00030 enum real_value_class {
00031 rvc_zero,
00032 rvc_normal,
00033 rvc_inf,
00034 rvc_nan
00035 };
00036
00037 #define SIGNIFICAND_BITS (128 + HOST_BITS_PER_LONG)
00038 #define EXP_BITS (32 - 6)
00039 #define MAX_EXP ((1 << (EXP_BITS - 1)) - 1)
00040 #define SIGSZ (SIGNIFICAND_BITS / HOST_BITS_PER_LONG)
00041 #define SIG_MSB ((unsigned long)1 << (HOST_BITS_PER_LONG - 1))
00042
00043 struct real_value GTY(())
00044 {
00045
00046
00047
00048 unsigned int cl : 2;
00049 unsigned int decimal : 1;
00050 unsigned int sign : 1;
00051 unsigned int signalling : 1;
00052 unsigned int canonical : 1;
00053 unsigned int uexp : EXP_BITS;
00054 unsigned long sig[SIGSZ];
00055 };
00056
00057 #define REAL_EXP(REAL) \
00058 ((int)((REAL)->uexp ^ (unsigned int)(1 << (EXP_BITS - 1))) \
00059 - (1 << (EXP_BITS - 1)))
00060 #define SET_REAL_EXP(REAL, EXP) \
00061 ((REAL)->uexp = ((unsigned int)(EXP) & (unsigned int)((1 << EXP_BITS) - 1)))
00062
00063
00064
00065
00066 #define REAL_VALUE_TYPE struct real_value
00067
00068
00069
00070
00071
00072 #define REAL_VALUE_TYPE_SIZE (SIGNIFICAND_BITS + 32)
00073 #define REAL_WIDTH \
00074 (REAL_VALUE_TYPE_SIZE/HOST_BITS_PER_WIDE_INT \
00075 + (REAL_VALUE_TYPE_SIZE%HOST_BITS_PER_WIDE_INT ? 1 : 0))
00076
00077
00078 extern char test_real_width
00079 [sizeof(REAL_VALUE_TYPE) <= REAL_WIDTH*sizeof(HOST_WIDE_INT) ? 1 : -1];
00080
00081
00082
00083
00084
00085
00086
00087
00088 #if REAL_WIDTH == 1
00089 # define CONST_DOUBLE_FORMAT "ww"
00090 #else
00091 # if REAL_WIDTH == 2
00092 # define CONST_DOUBLE_FORMAT "ww"
00093 # else
00094 # if REAL_WIDTH == 3
00095 # define CONST_DOUBLE_FORMAT "www"
00096 # else
00097 # if REAL_WIDTH == 4
00098 # define CONST_DOUBLE_FORMAT "wwww"
00099 # else
00100 # if REAL_WIDTH == 5
00101 # define CONST_DOUBLE_FORMAT "wwwww"
00102 # else
00103 # if REAL_WIDTH == 6
00104 # define CONST_DOUBLE_FORMAT "wwwwww"
00105 # else
00106 #error "REAL_WIDTH > 6 not supported"
00107 # endif
00108 # endif
00109 # endif
00110 # endif
00111 # endif
00112 #endif
00113
00114
00115
00116 struct real_format
00117 {
00118
00119 void (*encode) (const struct real_format *, long *,
00120 const REAL_VALUE_TYPE *);
00121 void (*decode) (const struct real_format *, REAL_VALUE_TYPE *,
00122 const long *);
00123
00124
00125 int b;
00126
00127
00128 int log2_b;
00129
00130
00131 int p;
00132
00133
00134 int pnan;
00135
00136
00137 int emin;
00138
00139
00140 int emax;
00141
00142
00143
00144 int signbit_ro;
00145
00146
00147
00148 int signbit_rw;
00149
00150
00151 bool has_nans;
00152 bool has_inf;
00153 bool has_denorm;
00154 bool has_signed_zero;
00155 bool qnan_msb_set;
00156 };
00157
00158
00159
00160
00161
00162
00163
00164 extern const struct real_format *
00165 real_format_for_mode[MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1
00166 + MAX_MODE_DECIMAL_FLOAT - MIN_MODE_DECIMAL_FLOAT + 1];
00167
00168 #define REAL_MODE_FORMAT(MODE) \
00169 (real_format_for_mode[DECIMAL_FLOAT_MODE_P (MODE) \
00170 ? ((MODE - MIN_MODE_DECIMAL_FLOAT) \
00171 + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) \
00172 : (MODE - MIN_MODE_FLOAT)])
00173
00174
00175
00176
00177 #define REAL_MODE_FORMAT_COMPOSITE_P(MODE) \
00178 ((REAL_MODE_FORMAT(MODE))->pnan < (REAL_MODE_FORMAT (MODE))->p)
00179
00180
00181
00182
00183 extern bool real_arithmetic (REAL_VALUE_TYPE *, int, const REAL_VALUE_TYPE *,
00184 const REAL_VALUE_TYPE *);
00185
00186
00187 extern bool real_compare (int, const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
00188
00189
00190 extern bool real_isinf (const REAL_VALUE_TYPE *);
00191
00192
00193 extern bool real_isnan (const REAL_VALUE_TYPE *);
00194
00195
00196 extern bool real_isneg (const REAL_VALUE_TYPE *);
00197
00198
00199 extern bool real_isnegzero (const REAL_VALUE_TYPE *);
00200
00201
00202 extern bool real_identical (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
00203
00204
00205 extern void real_convert (REAL_VALUE_TYPE *, enum machine_mode,
00206 const REAL_VALUE_TYPE *);
00207
00208
00209 extern bool exact_real_truncate (enum machine_mode, const REAL_VALUE_TYPE *);
00210
00211
00212 extern void real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t,
00213 size_t, int);
00214
00215
00216 extern void real_to_hexadecimal (char *, const REAL_VALUE_TYPE *,
00217 size_t, size_t, int);
00218
00219
00220 extern HOST_WIDE_INT real_to_integer (const REAL_VALUE_TYPE *);
00221 extern void real_to_integer2 (HOST_WIDE_INT *, HOST_WIDE_INT *,
00222 const REAL_VALUE_TYPE *);
00223
00224
00225 extern void real_from_string (REAL_VALUE_TYPE *, const char *);
00226
00227 extern void real_from_string3 (REAL_VALUE_TYPE *, const char *, enum machine_mode);
00228
00229
00230 extern void real_from_integer (REAL_VALUE_TYPE *, enum machine_mode,
00231 unsigned HOST_WIDE_INT, HOST_WIDE_INT, int);
00232
00233 extern long real_to_target_fmt (long *, const REAL_VALUE_TYPE *,
00234 const struct real_format *);
00235 extern long real_to_target (long *, const REAL_VALUE_TYPE *, enum machine_mode);
00236
00237 extern void real_from_target_fmt (REAL_VALUE_TYPE *, const long *,
00238 const struct real_format *);
00239 extern void real_from_target (REAL_VALUE_TYPE *, const long *,
00240 enum machine_mode);
00241
00242 extern void real_inf (REAL_VALUE_TYPE *);
00243
00244 extern bool real_nan (REAL_VALUE_TYPE *, const char *, int, enum machine_mode);
00245
00246 extern void real_maxval (REAL_VALUE_TYPE *, int, enum machine_mode);
00247
00248 extern void real_2expN (REAL_VALUE_TYPE *, int);
00249
00250 extern unsigned int real_hash (const REAL_VALUE_TYPE *);
00251
00252
00253
00254 extern const struct real_format ieee_single_format;
00255 extern const struct real_format mips_single_format;
00256 extern const struct real_format ieee_double_format;
00257 extern const struct real_format mips_double_format;
00258 extern const struct real_format ieee_extended_motorola_format;
00259 extern const struct real_format ieee_extended_intel_96_format;
00260 extern const struct real_format ieee_extended_intel_96_round_53_format;
00261 extern const struct real_format ieee_extended_intel_128_format;
00262 extern const struct real_format ibm_extended_format;
00263 extern const struct real_format mips_extended_format;
00264 extern const struct real_format ieee_quad_format;
00265 extern const struct real_format mips_quad_format;
00266 extern const struct real_format vax_f_format;
00267 extern const struct real_format vax_d_format;
00268 extern const struct real_format vax_g_format;
00269 extern const struct real_format i370_single_format;
00270 extern const struct real_format i370_double_format;
00271 extern const struct real_format c4x_single_format;
00272 extern const struct real_format c4x_extended_format;
00273 extern const struct real_format real_internal_format;
00274 extern const struct real_format decimal_single_format;
00275 extern const struct real_format decimal_double_format;
00276 extern const struct real_format decimal_quad_format;
00277
00278
00279
00280
00281
00282 #define REAL_ARITHMETIC(value, code, d1, d2) \
00283 real_arithmetic (&(value), code, &(d1), &(d2))
00284
00285 #define REAL_VALUES_IDENTICAL(x, y) real_identical (&(x), &(y))
00286 #define REAL_VALUES_EQUAL(x, y) real_compare (EQ_EXPR, &(x), &(y))
00287 #define REAL_VALUES_LESS(x, y) real_compare (LT_EXPR, &(x), &(y))
00288
00289
00290 #define REAL_VALUE_ISINF(x) real_isinf (&(x))
00291
00292
00293 #define REAL_VALUE_ISNAN(x) real_isnan (&(x))
00294
00295
00296 #define REAL_VALUE_NEGATIVE(x) real_isneg (&(x))
00297
00298
00299 #define REAL_VALUE_MINUS_ZERO(x) real_isnegzero (&(x))
00300
00301
00302 #define REAL_VALUE_TO_TARGET_LONG_DOUBLE(IN, OUT) \
00303 real_to_target (OUT, &(IN), \
00304 mode_for_size (LONG_DOUBLE_TYPE_SIZE, MODE_FLOAT, 0))
00305
00306 #define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT) \
00307 real_to_target (OUT, &(IN), mode_for_size (64, MODE_FLOAT, 0))
00308
00309
00310 #define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) \
00311 ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_FLOAT, 0)))
00312
00313 #define REAL_VALUE_FROM_INT(r, lo, hi, mode) \
00314 real_from_integer (&(r), mode, lo, hi, 0)
00315
00316 #define REAL_VALUE_FROM_UNSIGNED_INT(r, lo, hi, mode) \
00317 real_from_integer (&(r), mode, lo, hi, 1)
00318
00319
00320
00321
00322 #define REAL_VALUE_TO_TARGET_DECIMAL128(IN, OUT) \
00323 real_to_target (OUT, &(IN), mode_for_size (128, MODE_DECIMAL_FLOAT, 0))
00324
00325 #define REAL_VALUE_TO_TARGET_DECIMAL64(IN, OUT) \
00326 real_to_target (OUT, &(IN), mode_for_size (64, MODE_DECIMAL_FLOAT, 0))
00327
00328
00329 #define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \
00330 ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_DECIMAL_FLOAT, 0)))
00331
00332 extern REAL_VALUE_TYPE real_value_truncate (enum machine_mode,
00333 REAL_VALUE_TYPE);
00334
00335 #define REAL_VALUE_TO_INT(plow, phigh, r) \
00336 real_to_integer2 (plow, phigh, &(r))
00337
00338 extern REAL_VALUE_TYPE real_arithmetic2 (int, const REAL_VALUE_TYPE *,
00339 const REAL_VALUE_TYPE *);
00340
00341 #define REAL_VALUE_NEGATE(X) \
00342 real_arithmetic2 (NEGATE_EXPR, &(X), NULL)
00343
00344 #define REAL_VALUE_ABS(X) \
00345 real_arithmetic2 (ABS_EXPR, &(X), NULL)
00346
00347 extern int significand_size (enum machine_mode);
00348
00349 extern REAL_VALUE_TYPE real_from_string2 (const char *, enum machine_mode);
00350
00351 #define REAL_VALUE_ATOF(s, m) \
00352 real_from_string2 (s, m)
00353
00354 #define CONST_DOUBLE_ATOF(s, m) \
00355 CONST_DOUBLE_FROM_REAL_VALUE (real_from_string2 (s, m), m)
00356
00357 #define REAL_VALUE_FIX(r) \
00358 real_to_integer (&(r))
00359
00360
00361 #define REAL_VALUE_UNSIGNED_FIX(r) \
00362 real_to_integer (&(r))
00363
00364
00365
00366
00367 extern int real_exponent (const REAL_VALUE_TYPE *);
00368
00369
00370 extern void real_ldexp (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
00371
00372
00373
00374
00375
00376 extern REAL_VALUE_TYPE dconst0;
00377 extern REAL_VALUE_TYPE dconst1;
00378 extern REAL_VALUE_TYPE dconst2;
00379 extern REAL_VALUE_TYPE dconst3;
00380 extern REAL_VALUE_TYPE dconst10;
00381 extern REAL_VALUE_TYPE dconstm1;
00382 extern REAL_VALUE_TYPE dconstm2;
00383 extern REAL_VALUE_TYPE dconsthalf;
00384 extern REAL_VALUE_TYPE dconstthird;
00385 extern REAL_VALUE_TYPE dconstpi;
00386 extern REAL_VALUE_TYPE dconste;
00387
00388
00389
00390 REAL_VALUE_TYPE real_value_from_int_cst (tree, tree);
00391
00392
00393 #define REAL_VALUE_FROM_CONST_DOUBLE(to, from) \
00394 ((to) = *CONST_DOUBLE_REAL_VALUE (from))
00395
00396
00397 #define CONST_DOUBLE_FROM_REAL_VALUE(r, m) \
00398 const_double_from_real_value (r, m)
00399 extern rtx const_double_from_real_value (REAL_VALUE_TYPE, enum machine_mode);
00400
00401
00402 extern bool exact_real_inverse (enum machine_mode, REAL_VALUE_TYPE *);
00403
00404
00405 extern tree build_real (tree, REAL_VALUE_TYPE);
00406
00407
00408 extern bool real_sqrt (REAL_VALUE_TYPE *, enum machine_mode,
00409 const REAL_VALUE_TYPE *);
00410
00411
00412 extern bool real_powi (REAL_VALUE_TYPE *, enum machine_mode,
00413 const REAL_VALUE_TYPE *, HOST_WIDE_INT);
00414
00415
00416 extern void real_trunc (REAL_VALUE_TYPE *, enum machine_mode,
00417 const REAL_VALUE_TYPE *);
00418 extern void real_floor (REAL_VALUE_TYPE *, enum machine_mode,
00419 const REAL_VALUE_TYPE *);
00420 extern void real_ceil (REAL_VALUE_TYPE *, enum machine_mode,
00421 const REAL_VALUE_TYPE *);
00422 extern void real_round (REAL_VALUE_TYPE *, enum machine_mode,
00423 const REAL_VALUE_TYPE *);
00424
00425
00426 extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
00427
00428 #endif