1 1.1 mrg /* real.cc - software floating point emulation. 2 1.1 mrg Copyright (C) 1993-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Stephen L. Moshier (moshier (at) world.std.com). 4 1.1 mrg Re-written by Richard Henderson <rth (at) redhat.com> 5 1.1 mrg 6 1.1 mrg This file is part of GCC. 7 1.1 mrg 8 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 9 1.1 mrg the terms of the GNU General Public License as published by the Free 10 1.1 mrg Software Foundation; either version 3, or (at your option) any later 11 1.1 mrg version. 12 1.1 mrg 13 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16 1.1 mrg for more details. 17 1.1 mrg 18 1.1 mrg You should have received a copy of the GNU General Public License 19 1.1 mrg along with GCC; see the file COPYING3. If not see 20 1.1 mrg <http://www.gnu.org/licenses/>. */ 21 1.1 mrg 22 1.1 mrg #include "config.h" 23 1.1 mrg #include "system.h" 24 1.1 mrg #include "coretypes.h" 25 1.1 mrg #include "tm.h" 26 1.1 mrg #include "rtl.h" 27 1.1 mrg #include "tree.h" 28 1.1 mrg #include "realmpfr.h" 29 1.1 mrg #include "dfp.h" 30 1.1 mrg 31 1.1 mrg /* The floating point model used internally is not exactly IEEE 754 32 1.1 mrg compliant, and close to the description in the ISO C99 standard, 33 1.1 mrg section 5.2.4.2.2 Characteristics of floating types. 34 1.1 mrg 35 1.1 mrg Specifically 36 1.1 mrg 37 1.1 mrg x = s * b^e * \sum_{k=1}^p f_k * b^{-k} 38 1.1 mrg 39 1.1 mrg where 40 1.1 mrg s = sign (+- 1) 41 1.1 mrg b = base or radix, here always 2 42 1.1 mrg e = exponent 43 1.1 mrg p = precision (the number of base-b digits in the significand) 44 1.1 mrg f_k = the digits of the significand. 45 1.1 mrg 46 1.1 mrg We differ from typical IEEE 754 encodings in that the entire 47 1.1 mrg significand is fractional. Normalized significands are in the 48 1.1 mrg range [0.5, 1.0). 49 1.1 mrg 50 1.1 mrg A requirement of the model is that P be larger than the largest 51 1.1 mrg supported target floating-point type by at least 2 bits. This gives 52 1.1 mrg us proper rounding when we truncate to the target type. In addition, 53 1.1 mrg E must be large enough to hold the smallest supported denormal number 54 1.1 mrg in a normalized form. 55 1.1 mrg 56 1.1 mrg Both of these requirements are easily satisfied. The largest target 57 1.1 mrg significand is 113 bits; we store at least 160. The smallest 58 1.1 mrg denormal number fits in 17 exponent bits; we store 26. */ 59 1.1 mrg 60 1.1 mrg 61 1.1 mrg /* Used to classify two numbers simultaneously. */ 62 1.1 mrg #define CLASS2(A, B) ((A) << 2 | (B)) 63 1.1 mrg 64 1.1 mrg #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32 65 1.1 mrg #error "Some constant folding done by hand to avoid shift count warnings" 66 1.1 mrg #endif 67 1.1 mrg 68 1.1 mrg static void get_zero (REAL_VALUE_TYPE *, int); 69 1.1 mrg static void get_canonical_qnan (REAL_VALUE_TYPE *, int); 70 1.1 mrg static void get_canonical_snan (REAL_VALUE_TYPE *, int); 71 1.1 mrg static void get_inf (REAL_VALUE_TYPE *, int); 72 1.1 mrg static bool sticky_rshift_significand (REAL_VALUE_TYPE *, 73 1.1 mrg const REAL_VALUE_TYPE *, unsigned int); 74 1.1 mrg static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, 75 1.1 mrg unsigned int); 76 1.1 mrg static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, 77 1.1 mrg unsigned int); 78 1.1 mrg static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); 79 1.1 mrg static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *, 80 1.1 mrg const REAL_VALUE_TYPE *); 81 1.1 mrg static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, 82 1.1 mrg const REAL_VALUE_TYPE *, int); 83 1.1 mrg static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); 84 1.1 mrg static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); 85 1.1 mrg static int cmp_significand_0 (const REAL_VALUE_TYPE *); 86 1.1 mrg static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int); 87 1.1 mrg static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int); 88 1.1 mrg static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int); 89 1.1 mrg static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int); 90 1.1 mrg static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, 91 1.1 mrg const REAL_VALUE_TYPE *); 92 1.1 mrg static void normalize (REAL_VALUE_TYPE *); 93 1.1 mrg 94 1.1 mrg static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, 95 1.1 mrg const REAL_VALUE_TYPE *, int); 96 1.1 mrg static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, 97 1.1 mrg const REAL_VALUE_TYPE *); 98 1.1 mrg static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, 99 1.1 mrg const REAL_VALUE_TYPE *); 100 1.1 mrg static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int); 101 1.1 mrg static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); 102 1.1 mrg 103 1.1 mrg static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *); 104 1.1 mrg static void decimal_from_integer (REAL_VALUE_TYPE *); 105 1.1 mrg static void decimal_integer_string (char *, const REAL_VALUE_TYPE *, 106 1.1 mrg size_t); 107 1.1 mrg 108 1.1 mrg static const REAL_VALUE_TYPE * ten_to_ptwo (int); 109 1.1 mrg static const REAL_VALUE_TYPE * ten_to_mptwo (int); 110 1.1 mrg static const REAL_VALUE_TYPE * real_digit (int); 111 1.1 mrg static void times_pten (REAL_VALUE_TYPE *, int); 112 1.1 mrg 113 1.1 mrg static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *); 114 1.1 mrg 115 1.1 mrg /* Initialize R with a positive zero. */ 117 1.1 mrg 118 1.1 mrg static inline void 119 1.1 mrg get_zero (REAL_VALUE_TYPE *r, int sign) 120 1.1 mrg { 121 1.1 mrg memset (r, 0, sizeof (*r)); 122 1.1 mrg r->sign = sign; 123 1.1 mrg } 124 1.1 mrg 125 1.1 mrg /* Initialize R with the canonical quiet NaN. */ 126 1.1 mrg 127 1.1 mrg static inline void 128 1.1 mrg get_canonical_qnan (REAL_VALUE_TYPE *r, int sign) 129 1.1 mrg { 130 1.1 mrg memset (r, 0, sizeof (*r)); 131 1.1 mrg r->cl = rvc_nan; 132 1.1 mrg r->sign = sign; 133 1.1 mrg r->canonical = 1; 134 1.1 mrg } 135 1.1 mrg 136 1.1 mrg static inline void 137 1.1 mrg get_canonical_snan (REAL_VALUE_TYPE *r, int sign) 138 1.1 mrg { 139 1.1 mrg memset (r, 0, sizeof (*r)); 140 1.1 mrg r->cl = rvc_nan; 141 1.1 mrg r->sign = sign; 142 1.1 mrg r->signalling = 1; 143 1.1 mrg r->canonical = 1; 144 1.1 mrg } 145 1.1 mrg 146 1.1 mrg static inline void 147 1.1 mrg get_inf (REAL_VALUE_TYPE *r, int sign) 148 1.1 mrg { 149 1.1 mrg memset (r, 0, sizeof (*r)); 150 1.1 mrg r->cl = rvc_inf; 151 1.1 mrg r->sign = sign; 152 1.1 mrg } 153 1.1 mrg 154 1.1 mrg 155 1.1 mrg /* Right-shift the significand of A by N bits; put the result in the 157 1.1 mrg significand of R. If any one bits are shifted out, return true. */ 158 1.1 mrg 159 1.1 mrg static bool 160 1.1 mrg sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 161 1.1 mrg unsigned int n) 162 1.1 mrg { 163 1.1 mrg unsigned long sticky = 0; 164 1.1 mrg unsigned int i, ofs = 0; 165 1.1 mrg 166 1.1 mrg if (n >= HOST_BITS_PER_LONG) 167 1.1 mrg { 168 1.1 mrg for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i) 169 1.1 mrg sticky |= a->sig[i]; 170 1.1 mrg n &= HOST_BITS_PER_LONG - 1; 171 1.1 mrg } 172 1.1 mrg 173 1.1 mrg if (n != 0) 174 1.1 mrg { 175 1.1 mrg sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1); 176 1.1 mrg for (i = 0; i < SIGSZ; ++i) 177 1.1 mrg { 178 1.1 mrg r->sig[i] 179 1.1 mrg = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n) 180 1.1 mrg | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1]) 181 1.1 mrg << (HOST_BITS_PER_LONG - n))); 182 1.1 mrg } 183 1.1 mrg } 184 1.1 mrg else 185 1.1 mrg { 186 1.1 mrg for (i = 0; ofs + i < SIGSZ; ++i) 187 1.1 mrg r->sig[i] = a->sig[ofs + i]; 188 1.1 mrg for (; i < SIGSZ; ++i) 189 1.1 mrg r->sig[i] = 0; 190 1.1 mrg } 191 1.1 mrg 192 1.1 mrg return sticky != 0; 193 1.1 mrg } 194 1.1 mrg 195 1.1 mrg /* Right-shift the significand of A by N bits; put the result in the 196 1.1 mrg significand of R. */ 197 1.1 mrg 198 1.1 mrg static void 199 1.1 mrg rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 200 1.1 mrg unsigned int n) 201 1.1 mrg { 202 1.1 mrg unsigned int i, ofs = n / HOST_BITS_PER_LONG; 203 1.1 mrg 204 1.1 mrg n &= HOST_BITS_PER_LONG - 1; 205 1.1 mrg if (n != 0) 206 1.1 mrg { 207 1.1 mrg for (i = 0; i < SIGSZ; ++i) 208 1.1 mrg { 209 1.1 mrg r->sig[i] 210 1.1 mrg = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n) 211 1.1 mrg | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1]) 212 1.1 mrg << (HOST_BITS_PER_LONG - n))); 213 1.1 mrg } 214 1.1 mrg } 215 1.1 mrg else 216 1.1 mrg { 217 1.1 mrg for (i = 0; ofs + i < SIGSZ; ++i) 218 1.1 mrg r->sig[i] = a->sig[ofs + i]; 219 1.1 mrg for (; i < SIGSZ; ++i) 220 1.1 mrg r->sig[i] = 0; 221 1.1 mrg } 222 1.1 mrg } 223 1.1 mrg 224 1.1 mrg /* Left-shift the significand of A by N bits; put the result in the 225 1.1 mrg significand of R. */ 226 1.1 mrg 227 1.1 mrg static void 228 1.1 mrg lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 229 1.1 mrg unsigned int n) 230 1.1 mrg { 231 1.1 mrg unsigned int i, ofs = n / HOST_BITS_PER_LONG; 232 1.1 mrg 233 1.1 mrg n &= HOST_BITS_PER_LONG - 1; 234 1.1 mrg if (n == 0) 235 1.1 mrg { 236 1.1 mrg for (i = 0; ofs + i < SIGSZ; ++i) 237 1.1 mrg r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs]; 238 1.1 mrg for (; i < SIGSZ; ++i) 239 1.1 mrg r->sig[SIGSZ-1-i] = 0; 240 1.1 mrg } 241 1.1 mrg else 242 1.1 mrg for (i = 0; i < SIGSZ; ++i) 243 1.1 mrg { 244 1.1 mrg r->sig[SIGSZ-1-i] 245 1.1 mrg = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n) 246 1.1 mrg | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1]) 247 1.1 mrg >> (HOST_BITS_PER_LONG - n))); 248 1.1 mrg } 249 1.1 mrg } 250 1.1 mrg 251 1.1 mrg /* Likewise, but N is specialized to 1. */ 252 1.1 mrg 253 1.1 mrg static inline void 254 1.1 mrg lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a) 255 1.1 mrg { 256 1.1 mrg unsigned int i; 257 1.1 mrg 258 1.1 mrg for (i = SIGSZ - 1; i > 0; --i) 259 1.1 mrg r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1)); 260 1.1 mrg r->sig[0] = a->sig[0] << 1; 261 1.1 mrg } 262 1.1 mrg 263 1.1 mrg /* Add the significands of A and B, placing the result in R. Return 264 1.1 mrg true if there was carry out of the most significant word. */ 265 1.1 mrg 266 1.1 mrg static inline bool 267 1.1 mrg add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 268 1.1 mrg const REAL_VALUE_TYPE *b) 269 1.1 mrg { 270 1.1 mrg bool carry = false; 271 1.1 mrg int i; 272 1.1 mrg 273 1.1 mrg for (i = 0; i < SIGSZ; ++i) 274 1.1 mrg { 275 1.1 mrg unsigned long ai = a->sig[i]; 276 1.1 mrg unsigned long ri = ai + b->sig[i]; 277 1.1 mrg 278 1.1 mrg if (carry) 279 1.1 mrg { 280 1.1 mrg carry = ri < ai; 281 1.1 mrg carry |= ++ri == 0; 282 1.1 mrg } 283 1.1 mrg else 284 1.1 mrg carry = ri < ai; 285 1.1 mrg 286 1.1 mrg r->sig[i] = ri; 287 1.1 mrg } 288 1.1 mrg 289 1.1 mrg return carry; 290 1.1 mrg } 291 1.1 mrg 292 1.1 mrg /* Subtract the significands of A and B, placing the result in R. CARRY is 293 1.1 mrg true if there's a borrow incoming to the least significant word. 294 1.1 mrg Return true if there was borrow out of the most significant word. */ 295 1.1 mrg 296 1.1 mrg static inline bool 297 1.1 mrg sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 298 1.1 mrg const REAL_VALUE_TYPE *b, int carry) 299 1.1 mrg { 300 1.1 mrg int i; 301 1.1 mrg 302 1.1 mrg for (i = 0; i < SIGSZ; ++i) 303 1.1 mrg { 304 1.1 mrg unsigned long ai = a->sig[i]; 305 1.1 mrg unsigned long ri = ai - b->sig[i]; 306 1.1 mrg 307 1.1 mrg if (carry) 308 1.1 mrg { 309 1.1 mrg carry = ri > ai; 310 1.1 mrg carry |= ~--ri == 0; 311 1.1 mrg } 312 1.1 mrg else 313 1.1 mrg carry = ri > ai; 314 1.1 mrg 315 1.1 mrg r->sig[i] = ri; 316 1.1 mrg } 317 1.1 mrg 318 1.1 mrg return carry; 319 1.1 mrg } 320 1.1 mrg 321 1.1 mrg /* Negate the significand A, placing the result in R. */ 322 1.1 mrg 323 1.1 mrg static inline void 324 1.1 mrg neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a) 325 1.1 mrg { 326 1.1 mrg bool carry = true; 327 1.1 mrg int i; 328 1.1 mrg 329 1.1 mrg for (i = 0; i < SIGSZ; ++i) 330 1.1 mrg { 331 1.1 mrg unsigned long ri, ai = a->sig[i]; 332 1.1 mrg 333 1.1 mrg if (carry) 334 1.1 mrg { 335 1.1 mrg if (ai) 336 1.1 mrg { 337 1.1 mrg ri = -ai; 338 1.1 mrg carry = false; 339 1.1 mrg } 340 1.1 mrg else 341 1.1 mrg ri = ai; 342 1.1 mrg } 343 1.1 mrg else 344 1.1 mrg ri = ~ai; 345 1.1 mrg 346 1.1 mrg r->sig[i] = ri; 347 1.1 mrg } 348 1.1 mrg } 349 1.1 mrg 350 1.1 mrg /* Compare significands. Return tri-state vs zero. */ 351 1.1 mrg 352 1.1 mrg static inline int 353 1.1 mrg cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b) 354 1.1 mrg { 355 1.1 mrg int i; 356 1.1 mrg 357 1.1 mrg for (i = SIGSZ - 1; i >= 0; --i) 358 1.1 mrg { 359 1.1 mrg unsigned long ai = a->sig[i]; 360 1.1 mrg unsigned long bi = b->sig[i]; 361 1.1 mrg 362 1.1 mrg if (ai > bi) 363 1.1 mrg return 1; 364 1.1 mrg if (ai < bi) 365 1.1 mrg return -1; 366 1.1 mrg } 367 1.1 mrg 368 1.1 mrg return 0; 369 1.1 mrg } 370 1.1 mrg 371 1.1 mrg /* Return true if A is nonzero. */ 372 1.1 mrg 373 1.1 mrg static inline int 374 1.1 mrg cmp_significand_0 (const REAL_VALUE_TYPE *a) 375 1.1 mrg { 376 1.1 mrg int i; 377 1.1 mrg 378 1.1 mrg for (i = SIGSZ - 1; i >= 0; --i) 379 1.1 mrg if (a->sig[i]) 380 1.1 mrg return 1; 381 1.1 mrg 382 1.1 mrg return 0; 383 1.1 mrg } 384 1.1 mrg 385 1.1 mrg /* Set bit N of the significand of R. */ 386 1.1 mrg 387 1.1 mrg static inline void 388 1.1 mrg set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n) 389 1.1 mrg { 390 1.1 mrg r->sig[n / HOST_BITS_PER_LONG] 391 1.1 mrg |= (unsigned long)1 << (n % HOST_BITS_PER_LONG); 392 1.1 mrg } 393 1.1 mrg 394 1.1 mrg /* Clear bit N of the significand of R. */ 395 1.1 mrg 396 1.1 mrg static inline void 397 1.1 mrg clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n) 398 1.1 mrg { 399 1.1 mrg r->sig[n / HOST_BITS_PER_LONG] 400 1.1 mrg &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG)); 401 1.1 mrg } 402 1.1 mrg 403 1.1 mrg /* Test bit N of the significand of R. */ 404 1.1 mrg 405 1.1 mrg static inline bool 406 1.1 mrg test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n) 407 1.1 mrg { 408 1.1 mrg /* ??? Compiler bug here if we return this expression directly. 409 1.1 mrg The conversion to bool strips the "&1" and we wind up testing 410 1.1 mrg e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */ 411 1.1 mrg int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1; 412 1.1 mrg return t; 413 1.1 mrg } 414 1.1 mrg 415 1.1 mrg /* Clear bits 0..N-1 of the significand of R. */ 416 1.1 mrg 417 1.1 mrg static void 418 1.1 mrg clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n) 419 1.1 mrg { 420 1.1 mrg int i, w = n / HOST_BITS_PER_LONG; 421 1.1 mrg 422 1.1 mrg for (i = 0; i < w; ++i) 423 1.1 mrg r->sig[i] = 0; 424 1.1 mrg 425 1.1 mrg /* We are actually passing N == SIGNIFICAND_BITS which would result 426 1.1 mrg in an out-of-bound access below. */ 427 1.1 mrg if (n % HOST_BITS_PER_LONG != 0) 428 1.1 mrg r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1); 429 1.1 mrg } 430 1.1 mrg 431 1.1 mrg /* Divide the significands of A and B, placing the result in R. Return 432 1.1 mrg true if the division was inexact. */ 433 1.1 mrg 434 1.1 mrg static inline bool 435 1.1 mrg div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 436 1.1 mrg const REAL_VALUE_TYPE *b) 437 1.1 mrg { 438 1.1 mrg REAL_VALUE_TYPE u; 439 1.1 mrg int i, bit = SIGNIFICAND_BITS - 1; 440 1.1 mrg unsigned long msb, inexact; 441 1.1 mrg 442 1.1 mrg u = *a; 443 1.1 mrg memset (r->sig, 0, sizeof (r->sig)); 444 1.1 mrg 445 1.1 mrg msb = 0; 446 1.1 mrg goto start; 447 1.1 mrg do 448 1.1 mrg { 449 1.1 mrg msb = u.sig[SIGSZ-1] & SIG_MSB; 450 1.1 mrg lshift_significand_1 (&u, &u); 451 1.1 mrg start: 452 1.1 mrg if (msb || cmp_significands (&u, b) >= 0) 453 1.1 mrg { 454 1.1 mrg sub_significands (&u, &u, b, 0); 455 1.1 mrg set_significand_bit (r, bit); 456 1.1 mrg } 457 1.1 mrg } 458 1.1 mrg while (--bit >= 0); 459 1.1 mrg 460 1.1 mrg for (i = 0, inexact = 0; i < SIGSZ; i++) 461 1.1 mrg inexact |= u.sig[i]; 462 1.1 mrg 463 1.1 mrg return inexact != 0; 464 1.1 mrg } 465 1.1 mrg 466 1.1 mrg /* Adjust the exponent and significand of R such that the most 467 1.1 mrg significant bit is set. We underflow to zero and overflow to 468 1.1 mrg infinity here, without denormals. (The intermediate representation 469 1.1 mrg exponent is large enough to handle target denormals normalized.) */ 470 1.1 mrg 471 1.1 mrg static void 472 1.1 mrg normalize (REAL_VALUE_TYPE *r) 473 1.1 mrg { 474 1.1 mrg int shift = 0, exp; 475 1.1 mrg int i, j; 476 1.1 mrg 477 1.1 mrg if (r->decimal) 478 1.1 mrg return; 479 1.1 mrg 480 1.1 mrg /* Find the first word that is nonzero. */ 481 1.1 mrg for (i = SIGSZ - 1; i >= 0; i--) 482 1.1 mrg if (r->sig[i] == 0) 483 1.1 mrg shift += HOST_BITS_PER_LONG; 484 1.1 mrg else 485 1.1 mrg break; 486 1.1 mrg 487 1.1 mrg /* Zero significand flushes to zero. */ 488 1.1 mrg if (i < 0) 489 1.1 mrg { 490 1.1 mrg r->cl = rvc_zero; 491 1.1 mrg SET_REAL_EXP (r, 0); 492 1.1 mrg return; 493 1.1 mrg } 494 1.1 mrg 495 1.1 mrg /* Find the first bit that is nonzero. */ 496 1.1 mrg for (j = 0; ; j++) 497 1.1 mrg if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j))) 498 1.1 mrg break; 499 1.1 mrg shift += j; 500 1.1 mrg 501 1.1 mrg if (shift > 0) 502 1.1 mrg { 503 1.1 mrg exp = REAL_EXP (r) - shift; 504 1.1 mrg if (exp > MAX_EXP) 505 1.1 mrg get_inf (r, r->sign); 506 1.1 mrg else if (exp < -MAX_EXP) 507 1.1 mrg get_zero (r, r->sign); 508 1.1 mrg else 509 1.1 mrg { 510 1.1 mrg SET_REAL_EXP (r, exp); 511 1.1 mrg lshift_significand (r, r, shift); 512 1.1 mrg } 513 1.1 mrg } 514 1.1 mrg } 515 1.1 mrg 516 1.1 mrg /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the 518 1.1 mrg result may be inexact due to a loss of precision. */ 519 1.1 mrg 520 1.1 mrg static bool 521 1.1 mrg do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 522 1.1 mrg const REAL_VALUE_TYPE *b, int subtract_p) 523 1.1 mrg { 524 1.1 mrg int dexp, sign, exp; 525 1.1 mrg REAL_VALUE_TYPE t; 526 1.1 mrg bool inexact = false; 527 1.1 mrg 528 1.1 mrg /* Determine if we need to add or subtract. */ 529 1.1 mrg sign = a->sign; 530 1.1 mrg subtract_p = (sign ^ b->sign) ^ subtract_p; 531 1.1 mrg 532 1.1 mrg switch (CLASS2 (a->cl, b->cl)) 533 1.1 mrg { 534 1.1 mrg case CLASS2 (rvc_zero, rvc_zero): 535 1.1 mrg /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */ 536 1.1 mrg get_zero (r, sign & !subtract_p); 537 1.1 mrg return false; 538 1.1 mrg 539 1.1 mrg case CLASS2 (rvc_zero, rvc_normal): 540 1.1 mrg case CLASS2 (rvc_zero, rvc_inf): 541 1.1 mrg case CLASS2 (rvc_zero, rvc_nan): 542 1.1 mrg /* 0 + ANY = ANY. */ 543 1.1 mrg case CLASS2 (rvc_normal, rvc_nan): 544 1.1 mrg case CLASS2 (rvc_inf, rvc_nan): 545 1.1 mrg case CLASS2 (rvc_nan, rvc_nan): 546 1.1 mrg /* ANY + NaN = NaN. */ 547 1.1 mrg case CLASS2 (rvc_normal, rvc_inf): 548 1.1 mrg /* R + Inf = Inf. */ 549 1.1 mrg *r = *b; 550 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 551 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 552 1.1 mrg is on. */ 553 1.1 mrg r->signalling = 0; 554 1.1 mrg r->sign = sign ^ subtract_p; 555 1.1 mrg return false; 556 1.1 mrg 557 1.1 mrg case CLASS2 (rvc_normal, rvc_zero): 558 1.1 mrg case CLASS2 (rvc_inf, rvc_zero): 559 1.1 mrg case CLASS2 (rvc_nan, rvc_zero): 560 1.1 mrg /* ANY + 0 = ANY. */ 561 1.1 mrg case CLASS2 (rvc_nan, rvc_normal): 562 1.1 mrg case CLASS2 (rvc_nan, rvc_inf): 563 1.1 mrg /* NaN + ANY = NaN. */ 564 1.1 mrg case CLASS2 (rvc_inf, rvc_normal): 565 1.1 mrg /* Inf + R = Inf. */ 566 1.1 mrg *r = *a; 567 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 568 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 569 1.1 mrg is on. */ 570 1.1 mrg r->signalling = 0; 571 1.1 mrg return false; 572 1.1 mrg 573 1.1 mrg case CLASS2 (rvc_inf, rvc_inf): 574 1.1 mrg if (subtract_p) 575 1.1 mrg /* Inf - Inf = NaN. */ 576 1.1 mrg get_canonical_qnan (r, 0); 577 1.1 mrg else 578 1.1 mrg /* Inf + Inf = Inf. */ 579 1.1 mrg *r = *a; 580 1.1 mrg return false; 581 1.1 mrg 582 1.1 mrg case CLASS2 (rvc_normal, rvc_normal): 583 1.1 mrg break; 584 1.1 mrg 585 1.1 mrg default: 586 1.1 mrg gcc_unreachable (); 587 1.1 mrg } 588 1.1 mrg 589 1.1 mrg /* Swap the arguments such that A has the larger exponent. */ 590 1.1 mrg dexp = REAL_EXP (a) - REAL_EXP (b); 591 1.1 mrg if (dexp < 0) 592 1.1 mrg { 593 1.1 mrg const REAL_VALUE_TYPE *t; 594 1.1 mrg t = a, a = b, b = t; 595 1.1 mrg dexp = -dexp; 596 1.1 mrg sign ^= subtract_p; 597 1.1 mrg } 598 1.1 mrg exp = REAL_EXP (a); 599 1.1 mrg 600 1.1 mrg /* If the exponents are not identical, we need to shift the 601 1.1 mrg significand of B down. */ 602 1.1 mrg if (dexp > 0) 603 1.1 mrg { 604 1.1 mrg /* If the exponents are too far apart, the significands 605 1.1 mrg do not overlap, which makes the subtraction a noop. */ 606 1.1 mrg if (dexp >= SIGNIFICAND_BITS) 607 1.1 mrg { 608 1.1 mrg *r = *a; 609 1.1 mrg r->sign = sign; 610 1.1 mrg return true; 611 1.1 mrg } 612 1.1 mrg 613 1.1 mrg inexact |= sticky_rshift_significand (&t, b, dexp); 614 1.1 mrg b = &t; 615 1.1 mrg } 616 1.1 mrg 617 1.1 mrg if (subtract_p) 618 1.1 mrg { 619 1.1 mrg if (sub_significands (r, a, b, inexact)) 620 1.1 mrg { 621 1.1 mrg /* We got a borrow out of the subtraction. That means that 622 1.1 mrg A and B had the same exponent, and B had the larger 623 1.1 mrg significand. We need to swap the sign and negate the 624 1.1 mrg significand. */ 625 1.1 mrg sign ^= 1; 626 1.1 mrg neg_significand (r, r); 627 1.1 mrg } 628 1.1 mrg } 629 1.1 mrg else 630 1.1 mrg { 631 1.1 mrg if (add_significands (r, a, b)) 632 1.1 mrg { 633 1.1 mrg /* We got carry out of the addition. This means we need to 634 1.1 mrg shift the significand back down one bit and increase the 635 1.1 mrg exponent. */ 636 1.1 mrg inexact |= sticky_rshift_significand (r, r, 1); 637 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB; 638 1.1 mrg if (++exp > MAX_EXP) 639 1.1 mrg { 640 1.1 mrg get_inf (r, sign); 641 1.1 mrg return true; 642 1.1 mrg } 643 1.1 mrg } 644 1.1 mrg } 645 1.1 mrg 646 1.1 mrg r->cl = rvc_normal; 647 1.1 mrg r->sign = sign; 648 1.1 mrg SET_REAL_EXP (r, exp); 649 1.1 mrg /* Zero out the remaining fields. */ 650 1.1 mrg r->signalling = 0; 651 1.1 mrg r->canonical = 0; 652 1.1 mrg r->decimal = 0; 653 1.1 mrg 654 1.1 mrg /* Re-normalize the result. */ 655 1.1 mrg normalize (r); 656 1.1 mrg 657 1.1 mrg /* Special case: if the subtraction results in zero, the result 658 1.1 mrg is positive. */ 659 1.1 mrg if (r->cl == rvc_zero) 660 1.1 mrg r->sign = 0; 661 1.1 mrg else 662 1.1 mrg r->sig[0] |= inexact; 663 1.1 mrg 664 1.1 mrg return inexact; 665 1.1 mrg } 666 1.1 mrg 667 1.1 mrg /* Calculate R = A * B. Return true if the result may be inexact. */ 668 1.1 mrg 669 1.1 mrg static bool 670 1.1 mrg do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 671 1.1 mrg const REAL_VALUE_TYPE *b) 672 1.1 mrg { 673 1.1 mrg REAL_VALUE_TYPE u, t, *rr; 674 1.1 mrg unsigned int i, j, k; 675 1.1 mrg int sign = a->sign ^ b->sign; 676 1.1 mrg bool inexact = false; 677 1.1 mrg 678 1.1 mrg switch (CLASS2 (a->cl, b->cl)) 679 1.1 mrg { 680 1.1 mrg case CLASS2 (rvc_zero, rvc_zero): 681 1.1 mrg case CLASS2 (rvc_zero, rvc_normal): 682 1.1 mrg case CLASS2 (rvc_normal, rvc_zero): 683 1.1 mrg /* +-0 * ANY = 0 with appropriate sign. */ 684 1.1 mrg get_zero (r, sign); 685 1.1 mrg return false; 686 1.1 mrg 687 1.1 mrg case CLASS2 (rvc_zero, rvc_nan): 688 1.1 mrg case CLASS2 (rvc_normal, rvc_nan): 689 1.1 mrg case CLASS2 (rvc_inf, rvc_nan): 690 1.1 mrg case CLASS2 (rvc_nan, rvc_nan): 691 1.1 mrg /* ANY * NaN = NaN. */ 692 1.1 mrg *r = *b; 693 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 694 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 695 1.1 mrg is on. */ 696 1.1 mrg r->signalling = 0; 697 1.1 mrg r->sign = sign; 698 1.1 mrg return false; 699 1.1 mrg 700 1.1 mrg case CLASS2 (rvc_nan, rvc_zero): 701 1.1 mrg case CLASS2 (rvc_nan, rvc_normal): 702 1.1 mrg case CLASS2 (rvc_nan, rvc_inf): 703 1.1 mrg /* NaN * ANY = NaN. */ 704 1.1 mrg *r = *a; 705 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 706 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 707 1.1 mrg is on. */ 708 1.1 mrg r->signalling = 0; 709 1.1 mrg r->sign = sign; 710 1.1 mrg return false; 711 1.1 mrg 712 1.1 mrg case CLASS2 (rvc_zero, rvc_inf): 713 1.1 mrg case CLASS2 (rvc_inf, rvc_zero): 714 1.1 mrg /* 0 * Inf = NaN */ 715 1.1 mrg get_canonical_qnan (r, sign); 716 1.1 mrg return false; 717 1.1 mrg 718 1.1 mrg case CLASS2 (rvc_inf, rvc_inf): 719 1.1 mrg case CLASS2 (rvc_normal, rvc_inf): 720 1.1 mrg case CLASS2 (rvc_inf, rvc_normal): 721 1.1 mrg /* Inf * Inf = Inf, R * Inf = Inf */ 722 1.1 mrg get_inf (r, sign); 723 1.1 mrg return false; 724 1.1 mrg 725 1.1 mrg case CLASS2 (rvc_normal, rvc_normal): 726 1.1 mrg break; 727 1.1 mrg 728 1.1 mrg default: 729 1.1 mrg gcc_unreachable (); 730 1.1 mrg } 731 1.1 mrg 732 1.1 mrg if (r == a || r == b) 733 1.1 mrg rr = &t; 734 1.1 mrg else 735 1.1 mrg rr = r; 736 1.1 mrg get_zero (rr, 0); 737 1.1 mrg 738 1.1 mrg /* Collect all the partial products. Since we don't have sure access 739 1.1 mrg to a widening multiply, we split each long into two half-words. 740 1.1 mrg 741 1.1 mrg Consider the long-hand form of a four half-word multiplication: 742 1.1 mrg 743 1.1 mrg A B C D 744 1.1 mrg * E F G H 745 1.1 mrg -------------- 746 1.1 mrg DE DF DG DH 747 1.1 mrg CE CF CG CH 748 1.1 mrg BE BF BG BH 749 1.1 mrg AE AF AG AH 750 1.1 mrg 751 1.1 mrg We construct partial products of the widened half-word products 752 1.1 mrg that are known to not overlap, e.g. DF+DH. Each such partial 753 1.1 mrg product is given its proper exponent, which allows us to sum them 754 1.1 mrg and obtain the finished product. */ 755 1.1 mrg 756 1.1 mrg for (i = 0; i < SIGSZ * 2; ++i) 757 1.1 mrg { 758 1.1 mrg unsigned long ai = a->sig[i / 2]; 759 1.1 mrg if (i & 1) 760 1.1 mrg ai >>= HOST_BITS_PER_LONG / 2; 761 1.1 mrg else 762 1.1 mrg ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1; 763 1.1 mrg 764 1.1 mrg if (ai == 0) 765 1.1 mrg continue; 766 1.1 mrg 767 1.1 mrg for (j = 0; j < 2; ++j) 768 1.1 mrg { 769 1.1 mrg int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2) 770 1.1 mrg + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2))); 771 1.1 mrg 772 1.1 mrg if (exp > MAX_EXP) 773 1.1 mrg { 774 1.1 mrg get_inf (r, sign); 775 1.1 mrg return true; 776 1.1 mrg } 777 1.1 mrg if (exp < -MAX_EXP) 778 1.1 mrg { 779 1.1 mrg /* Would underflow to zero, which we shouldn't bother adding. */ 780 1.1 mrg inexact = true; 781 1.1 mrg continue; 782 1.1 mrg } 783 1.1 mrg 784 1.1 mrg memset (&u, 0, sizeof (u)); 785 1.1 mrg u.cl = rvc_normal; 786 1.1 mrg SET_REAL_EXP (&u, exp); 787 1.1 mrg 788 1.1 mrg for (k = j; k < SIGSZ * 2; k += 2) 789 1.1 mrg { 790 1.1 mrg unsigned long bi = b->sig[k / 2]; 791 1.1 mrg if (k & 1) 792 1.1 mrg bi >>= HOST_BITS_PER_LONG / 2; 793 1.1 mrg else 794 1.1 mrg bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1; 795 1.1 mrg 796 1.1 mrg u.sig[k / 2] = ai * bi; 797 1.1 mrg } 798 1.1 mrg 799 1.1 mrg normalize (&u); 800 1.1 mrg inexact |= do_add (rr, rr, &u, 0); 801 1.1 mrg } 802 1.1 mrg } 803 1.1 mrg 804 1.1 mrg rr->sign = sign; 805 1.1 mrg if (rr != r) 806 1.1 mrg *r = t; 807 1.1 mrg 808 1.1 mrg return inexact; 809 1.1 mrg } 810 1.1 mrg 811 1.1 mrg /* Calculate R = A / B. Return true if the result may be inexact. */ 812 1.1 mrg 813 1.1 mrg static bool 814 1.1 mrg do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a, 815 1.1 mrg const REAL_VALUE_TYPE *b) 816 1.1 mrg { 817 1.1 mrg int exp, sign = a->sign ^ b->sign; 818 1.1 mrg REAL_VALUE_TYPE t, *rr; 819 1.1 mrg bool inexact; 820 1.1 mrg 821 1.1 mrg switch (CLASS2 (a->cl, b->cl)) 822 1.1 mrg { 823 1.1 mrg case CLASS2 (rvc_zero, rvc_zero): 824 1.1 mrg /* 0 / 0 = NaN. */ 825 1.1 mrg case CLASS2 (rvc_inf, rvc_inf): 826 1.1 mrg /* Inf / Inf = NaN. */ 827 1.1 mrg get_canonical_qnan (r, sign); 828 1.1 mrg return false; 829 1.1 mrg 830 1.1 mrg case CLASS2 (rvc_zero, rvc_normal): 831 1.1 mrg case CLASS2 (rvc_zero, rvc_inf): 832 1.1 mrg /* 0 / ANY = 0. */ 833 1.1 mrg case CLASS2 (rvc_normal, rvc_inf): 834 1.1 mrg /* R / Inf = 0. */ 835 1.1 mrg get_zero (r, sign); 836 1.1 mrg return false; 837 1.1 mrg 838 1.1 mrg case CLASS2 (rvc_normal, rvc_zero): 839 1.1 mrg /* R / 0 = Inf. */ 840 1.1 mrg case CLASS2 (rvc_inf, rvc_zero): 841 1.1 mrg /* Inf / 0 = Inf. */ 842 1.1 mrg get_inf (r, sign); 843 1.1 mrg return false; 844 1.1 mrg 845 1.1 mrg case CLASS2 (rvc_zero, rvc_nan): 846 1.1 mrg case CLASS2 (rvc_normal, rvc_nan): 847 1.1 mrg case CLASS2 (rvc_inf, rvc_nan): 848 1.1 mrg case CLASS2 (rvc_nan, rvc_nan): 849 1.1 mrg /* ANY / NaN = NaN. */ 850 1.1 mrg *r = *b; 851 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 852 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 853 1.1 mrg is on. */ 854 1.1 mrg r->signalling = 0; 855 1.1 mrg r->sign = sign; 856 1.1 mrg return false; 857 1.1 mrg 858 1.1 mrg case CLASS2 (rvc_nan, rvc_zero): 859 1.1 mrg case CLASS2 (rvc_nan, rvc_normal): 860 1.1 mrg case CLASS2 (rvc_nan, rvc_inf): 861 1.1 mrg /* NaN / ANY = NaN. */ 862 1.1 mrg *r = *a; 863 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 864 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 865 1.1 mrg is on. */ 866 1.1 mrg r->signalling = 0; 867 1.1 mrg r->sign = sign; 868 1.1 mrg return false; 869 1.1 mrg 870 1.1 mrg case CLASS2 (rvc_inf, rvc_normal): 871 1.1 mrg /* Inf / R = Inf. */ 872 1.1 mrg get_inf (r, sign); 873 1.1 mrg return false; 874 1.1 mrg 875 1.1 mrg case CLASS2 (rvc_normal, rvc_normal): 876 1.1 mrg break; 877 1.1 mrg 878 1.1 mrg default: 879 1.1 mrg gcc_unreachable (); 880 1.1 mrg } 881 1.1 mrg 882 1.1 mrg if (r == a || r == b) 883 1.1 mrg rr = &t; 884 1.1 mrg else 885 1.1 mrg rr = r; 886 1.1 mrg 887 1.1 mrg /* Make sure all fields in the result are initialized. */ 888 1.1 mrg get_zero (rr, 0); 889 1.1 mrg rr->cl = rvc_normal; 890 1.1 mrg rr->sign = sign; 891 1.1 mrg 892 1.1 mrg exp = REAL_EXP (a) - REAL_EXP (b) + 1; 893 1.1 mrg if (exp > MAX_EXP) 894 1.1 mrg { 895 1.1 mrg get_inf (r, sign); 896 1.1 mrg return true; 897 1.1 mrg } 898 1.1 mrg if (exp < -MAX_EXP) 899 1.1 mrg { 900 1.1 mrg get_zero (r, sign); 901 1.1 mrg return true; 902 1.1 mrg } 903 1.1 mrg SET_REAL_EXP (rr, exp); 904 1.1 mrg 905 1.1 mrg inexact = div_significands (rr, a, b); 906 1.1 mrg 907 1.1 mrg /* Re-normalize the result. */ 908 1.1 mrg normalize (rr); 909 1.1 mrg rr->sig[0] |= inexact; 910 1.1 mrg 911 1.1 mrg if (rr != r) 912 1.1 mrg *r = t; 913 1.1 mrg 914 1.1 mrg return inexact; 915 1.1 mrg } 916 1.1 mrg 917 1.1 mrg /* Return a tri-state comparison of A vs B. Return NAN_RESULT if 918 1.1 mrg one of the two operands is a NaN. */ 919 1.1 mrg 920 1.1 mrg static int 921 1.1 mrg do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b, 922 1.1 mrg int nan_result) 923 1.1 mrg { 924 1.1 mrg int ret; 925 1.1 mrg 926 1.1 mrg switch (CLASS2 (a->cl, b->cl)) 927 1.1 mrg { 928 1.1 mrg case CLASS2 (rvc_zero, rvc_zero): 929 1.1 mrg /* Sign of zero doesn't matter for compares. */ 930 1.1 mrg return 0; 931 1.1 mrg 932 1.1 mrg case CLASS2 (rvc_normal, rvc_zero): 933 1.1 mrg /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */ 934 1.1 mrg if (a->decimal) 935 1.1 mrg return decimal_do_compare (a, b, nan_result); 936 1.1 mrg /* Fall through. */ 937 1.1 mrg case CLASS2 (rvc_inf, rvc_zero): 938 1.1 mrg case CLASS2 (rvc_inf, rvc_normal): 939 1.1 mrg return (a->sign ? -1 : 1); 940 1.1 mrg 941 1.1 mrg case CLASS2 (rvc_inf, rvc_inf): 942 1.1 mrg return -a->sign - -b->sign; 943 1.1 mrg 944 1.1 mrg case CLASS2 (rvc_zero, rvc_normal): 945 1.1 mrg /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */ 946 1.1 mrg if (b->decimal) 947 1.1 mrg return decimal_do_compare (a, b, nan_result); 948 1.1 mrg /* Fall through. */ 949 1.1 mrg case CLASS2 (rvc_zero, rvc_inf): 950 1.1 mrg case CLASS2 (rvc_normal, rvc_inf): 951 1.1 mrg return (b->sign ? 1 : -1); 952 1.1 mrg 953 1.1 mrg case CLASS2 (rvc_zero, rvc_nan): 954 1.1 mrg case CLASS2 (rvc_normal, rvc_nan): 955 1.1 mrg case CLASS2 (rvc_inf, rvc_nan): 956 1.1 mrg case CLASS2 (rvc_nan, rvc_nan): 957 1.1 mrg case CLASS2 (rvc_nan, rvc_zero): 958 1.1 mrg case CLASS2 (rvc_nan, rvc_normal): 959 1.1 mrg case CLASS2 (rvc_nan, rvc_inf): 960 1.1 mrg return nan_result; 961 1.1 mrg 962 1.1 mrg case CLASS2 (rvc_normal, rvc_normal): 963 1.1 mrg break; 964 1.1 mrg 965 1.1 mrg default: 966 1.1 mrg gcc_unreachable (); 967 1.1 mrg } 968 1.1 mrg 969 1.1 mrg if (a->decimal || b->decimal) 970 1.1 mrg return decimal_do_compare (a, b, nan_result); 971 1.1 mrg 972 1.1 mrg if (a->sign != b->sign) 973 1.1 mrg return -a->sign - -b->sign; 974 1.1 mrg 975 1.1 mrg if (REAL_EXP (a) > REAL_EXP (b)) 976 1.1 mrg ret = 1; 977 1.1 mrg else if (REAL_EXP (a) < REAL_EXP (b)) 978 1.1 mrg ret = -1; 979 1.1 mrg else 980 1.1 mrg ret = cmp_significands (a, b); 981 1.1 mrg 982 1.1 mrg return (a->sign ? -ret : ret); 983 1.1 mrg } 984 1.1 mrg 985 1.1 mrg /* Return A truncated to an integral value toward zero. */ 986 1.1 mrg 987 1.1 mrg static void 988 1.1 mrg do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a) 989 1.1 mrg { 990 1.1 mrg *r = *a; 991 1.1 mrg 992 1.1 mrg switch (r->cl) 993 1.1 mrg { 994 1.1 mrg case rvc_zero: 995 1.1 mrg case rvc_inf: 996 1.1 mrg case rvc_nan: 997 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 998 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 999 1.1 mrg is on. */ 1000 1.1 mrg r->signalling = 0; 1001 1.1 mrg break; 1002 1.1 mrg 1003 1.1 mrg case rvc_normal: 1004 1.1 mrg if (r->decimal) 1005 1.1 mrg { 1006 1.1 mrg decimal_do_fix_trunc (r, a); 1007 1.1 mrg return; 1008 1.1 mrg } 1009 1.1 mrg if (REAL_EXP (r) <= 0) 1010 1.1 mrg get_zero (r, r->sign); 1011 1.1 mrg else if (REAL_EXP (r) < SIGNIFICAND_BITS) 1012 1.1 mrg clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r)); 1013 1.1 mrg break; 1014 1.1 mrg 1015 1.1 mrg default: 1016 1.1 mrg gcc_unreachable (); 1017 1.1 mrg } 1018 1.1 mrg } 1019 1.1 mrg 1020 1.1 mrg /* Perform the binary or unary operation described by CODE. 1021 1.1 mrg For a unary operation, leave OP1 NULL. This function returns 1022 1.1 mrg true if the result may be inexact due to loss of precision. */ 1023 1.1 mrg 1024 1.1 mrg bool 1025 1.1 mrg real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0, 1026 1.1 mrg const REAL_VALUE_TYPE *op1) 1027 1.1 mrg { 1028 1.1 mrg enum tree_code code = (enum tree_code) icode; 1029 1.1 mrg 1030 1.1 mrg if (op0->decimal || (op1 && op1->decimal)) 1031 1.1 mrg return decimal_real_arithmetic (r, code, op0, op1); 1032 1.1 mrg 1033 1.1 mrg switch (code) 1034 1.1 mrg { 1035 1.1 mrg case PLUS_EXPR: 1036 1.1 mrg /* Clear any padding areas in *r if it isn't equal to one of the 1037 1.1 mrg operands so that we can later do bitwise comparisons later on. */ 1038 1.1 mrg if (r != op0 && r != op1) 1039 1.1 mrg memset (r, '\0', sizeof (*r)); 1040 1.1 mrg return do_add (r, op0, op1, 0); 1041 1.1 mrg 1042 1.1 mrg case MINUS_EXPR: 1043 1.1 mrg if (r != op0 && r != op1) 1044 1.1 mrg memset (r, '\0', sizeof (*r)); 1045 1.1 mrg return do_add (r, op0, op1, 1); 1046 1.1 mrg 1047 1.1 mrg case MULT_EXPR: 1048 1.1 mrg if (r != op0 && r != op1) 1049 1.1 mrg memset (r, '\0', sizeof (*r)); 1050 1.1 mrg return do_multiply (r, op0, op1); 1051 1.1 mrg 1052 1.1 mrg case RDIV_EXPR: 1053 1.1 mrg if (r != op0 && r != op1) 1054 1.1 mrg memset (r, '\0', sizeof (*r)); 1055 1.1 mrg return do_divide (r, op0, op1); 1056 1.1 mrg 1057 1.1 mrg case MIN_EXPR: 1058 1.1 mrg if (op1->cl == rvc_nan) 1059 1.1 mrg { 1060 1.1 mrg *r = *op1; 1061 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 1062 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 1063 1.1 mrg is on. */ 1064 1.1 mrg r->signalling = 0; 1065 1.1 mrg } 1066 1.1 mrg else if (do_compare (op0, op1, -1) < 0) 1067 1.1 mrg *r = *op0; 1068 1.1 mrg else 1069 1.1 mrg *r = *op1; 1070 1.1 mrg break; 1071 1.1 mrg 1072 1.1 mrg case MAX_EXPR: 1073 1.1 mrg if (op1->cl == rvc_nan) 1074 1.1 mrg { 1075 1.1 mrg *r = *op1; 1076 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 1077 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 1078 1.1 mrg is on. */ 1079 1.1 mrg r->signalling = 0; 1080 1.1 mrg } 1081 1.1 mrg else if (do_compare (op0, op1, 1) < 0) 1082 1.1 mrg *r = *op1; 1083 1.1 mrg else 1084 1.1 mrg *r = *op0; 1085 1.1 mrg break; 1086 1.1 mrg 1087 1.1 mrg case NEGATE_EXPR: 1088 1.1 mrg *r = *op0; 1089 1.1 mrg r->sign ^= 1; 1090 1.1 mrg break; 1091 1.1 mrg 1092 1.1 mrg case ABS_EXPR: 1093 1.1 mrg *r = *op0; 1094 1.1 mrg r->sign = 0; 1095 1.1 mrg break; 1096 1.1 mrg 1097 1.1 mrg case FIX_TRUNC_EXPR: 1098 1.1 mrg do_fix_trunc (r, op0); 1099 1.1 mrg break; 1100 1.1 mrg 1101 1.1 mrg default: 1102 1.1 mrg gcc_unreachable (); 1103 1.1 mrg } 1104 1.1 mrg return false; 1105 1.1 mrg } 1106 1.1 mrg 1107 1.1 mrg REAL_VALUE_TYPE 1108 1.1 mrg real_value_negate (const REAL_VALUE_TYPE *op0) 1109 1.1 mrg { 1110 1.1 mrg REAL_VALUE_TYPE r; 1111 1.1 mrg real_arithmetic (&r, NEGATE_EXPR, op0, NULL); 1112 1.1 mrg return r; 1113 1.1 mrg } 1114 1.1 mrg 1115 1.1 mrg REAL_VALUE_TYPE 1116 1.1 mrg real_value_abs (const REAL_VALUE_TYPE *op0) 1117 1.1 mrg { 1118 1.1 mrg REAL_VALUE_TYPE r; 1119 1.1 mrg real_arithmetic (&r, ABS_EXPR, op0, NULL); 1120 1.1 mrg return r; 1121 1.1 mrg } 1122 1.1 mrg 1123 1.1 mrg /* Return whether OP0 == OP1. */ 1124 1.1 mrg 1125 1.1 mrg bool 1126 1.1 mrg real_equal (const REAL_VALUE_TYPE *op0, const REAL_VALUE_TYPE *op1) 1127 1.1 mrg { 1128 1.1 mrg return do_compare (op0, op1, -1) == 0; 1129 1.1 mrg } 1130 1.1 mrg 1131 1.1 mrg /* Return whether OP0 < OP1. */ 1132 1.1 mrg 1133 1.1 mrg bool 1134 1.1 mrg real_less (const REAL_VALUE_TYPE *op0, const REAL_VALUE_TYPE *op1) 1135 1.1 mrg { 1136 1.1 mrg return do_compare (op0, op1, 1) < 0; 1137 1.1 mrg } 1138 1.1 mrg 1139 1.1 mrg bool 1140 1.1 mrg real_compare (int icode, const REAL_VALUE_TYPE *op0, 1141 1.1 mrg const REAL_VALUE_TYPE *op1) 1142 1.1 mrg { 1143 1.1 mrg enum tree_code code = (enum tree_code) icode; 1144 1.1 mrg 1145 1.1 mrg switch (code) 1146 1.1 mrg { 1147 1.1 mrg case LT_EXPR: 1148 1.1 mrg return real_less (op0, op1); 1149 1.1 mrg case LE_EXPR: 1150 1.1 mrg return do_compare (op0, op1, 1) <= 0; 1151 1.1 mrg case GT_EXPR: 1152 1.1 mrg return do_compare (op0, op1, -1) > 0; 1153 1.1 mrg case GE_EXPR: 1154 1.1 mrg return do_compare (op0, op1, -1) >= 0; 1155 1.1 mrg case EQ_EXPR: 1156 1.1 mrg return real_equal (op0, op1); 1157 1.1 mrg case NE_EXPR: 1158 1.1 mrg return do_compare (op0, op1, -1) != 0; 1159 1.1 mrg case UNORDERED_EXPR: 1160 1.1 mrg return op0->cl == rvc_nan || op1->cl == rvc_nan; 1161 1.1 mrg case ORDERED_EXPR: 1162 1.1 mrg return op0->cl != rvc_nan && op1->cl != rvc_nan; 1163 1.1 mrg case UNLT_EXPR: 1164 1.1 mrg return do_compare (op0, op1, -1) < 0; 1165 1.1 mrg case UNLE_EXPR: 1166 1.1 mrg return do_compare (op0, op1, -1) <= 0; 1167 1.1 mrg case UNGT_EXPR: 1168 1.1 mrg return do_compare (op0, op1, 1) > 0; 1169 1.1 mrg case UNGE_EXPR: 1170 1.1 mrg return do_compare (op0, op1, 1) >= 0; 1171 1.1 mrg case UNEQ_EXPR: 1172 1.1 mrg return do_compare (op0, op1, 0) == 0; 1173 1.1 mrg case LTGT_EXPR: 1174 1.1 mrg return do_compare (op0, op1, 0) != 0; 1175 1.1 mrg 1176 1.1 mrg default: 1177 1.1 mrg gcc_unreachable (); 1178 1.1 mrg } 1179 1.1 mrg } 1180 1.1 mrg 1181 1.1 mrg /* Return floor log2(R). */ 1182 1.1 mrg 1183 1.1 mrg int 1184 1.1 mrg real_exponent (const REAL_VALUE_TYPE *r) 1185 1.1 mrg { 1186 1.1 mrg switch (r->cl) 1187 1.1 mrg { 1188 1.1 mrg case rvc_zero: 1189 1.1 mrg return 0; 1190 1.1 mrg case rvc_inf: 1191 1.1 mrg case rvc_nan: 1192 1.1 mrg return (unsigned int)-1 >> 1; 1193 1.1 mrg case rvc_normal: 1194 1.1 mrg return REAL_EXP (r); 1195 1.1 mrg default: 1196 1.1 mrg gcc_unreachable (); 1197 1.1 mrg } 1198 1.1 mrg } 1199 1.1 mrg 1200 1.1 mrg /* R = OP0 * 2**EXP. */ 1201 1.1 mrg 1202 1.1 mrg void 1203 1.1 mrg real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp) 1204 1.1 mrg { 1205 1.1 mrg *r = *op0; 1206 1.1 mrg switch (r->cl) 1207 1.1 mrg { 1208 1.1 mrg case rvc_zero: 1209 1.1 mrg case rvc_inf: 1210 1.1 mrg case rvc_nan: 1211 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 1212 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 1213 1.1 mrg is on. */ 1214 1.1 mrg r->signalling = 0; 1215 1.1 mrg break; 1216 1.1 mrg 1217 1.1 mrg case rvc_normal: 1218 1.1 mrg exp += REAL_EXP (op0); 1219 1.1 mrg if (exp > MAX_EXP) 1220 1.1 mrg get_inf (r, r->sign); 1221 1.1 mrg else if (exp < -MAX_EXP) 1222 1.1 mrg get_zero (r, r->sign); 1223 1.1 mrg else 1224 1.1 mrg SET_REAL_EXP (r, exp); 1225 1.1 mrg break; 1226 1.1 mrg 1227 1.1 mrg default: 1228 1.1 mrg gcc_unreachable (); 1229 1.1 mrg } 1230 1.1 mrg } 1231 1.1 mrg 1232 1.1 mrg /* Determine whether a floating-point value X is infinite. */ 1233 1.1 mrg 1234 1.1 mrg bool 1235 1.1 mrg real_isinf (const REAL_VALUE_TYPE *r) 1236 1.1 mrg { 1237 1.1 mrg return (r->cl == rvc_inf); 1238 1.1 mrg } 1239 1.1 mrg 1240 1.1 mrg /* Determine whether a floating-point value X is a NaN. */ 1241 1.1 mrg 1242 1.1 mrg bool 1243 1.1 mrg real_isnan (const REAL_VALUE_TYPE *r) 1244 1.1 mrg { 1245 1.1 mrg return (r->cl == rvc_nan); 1246 1.1 mrg } 1247 1.1 mrg 1248 1.1 mrg /* Determine whether a floating-point value X is a signaling NaN. */ 1249 1.1 mrg bool real_issignaling_nan (const REAL_VALUE_TYPE *r) 1250 1.1 mrg { 1251 1.1 mrg return real_isnan (r) && r->signalling; 1252 1.1 mrg } 1253 1.1 mrg 1254 1.1 mrg /* Determine whether a floating-point value X is finite. */ 1255 1.1 mrg 1256 1.1 mrg bool 1257 1.1 mrg real_isfinite (const REAL_VALUE_TYPE *r) 1258 1.1 mrg { 1259 1.1 mrg return (r->cl != rvc_nan) && (r->cl != rvc_inf); 1260 1.1 mrg } 1261 1.1 mrg 1262 1.1 mrg /* Determine whether a floating-point value X is negative. */ 1263 1.1 mrg 1264 1.1 mrg bool 1265 1.1 mrg real_isneg (const REAL_VALUE_TYPE *r) 1266 1.1 mrg { 1267 1.1 mrg return r->sign; 1268 1.1 mrg } 1269 1.1 mrg 1270 1.1 mrg /* Determine whether a floating-point value X is minus zero. */ 1271 1.1 mrg 1272 1.1 mrg bool 1273 1.1 mrg real_isnegzero (const REAL_VALUE_TYPE *r) 1274 1.1 mrg { 1275 1.1 mrg return r->sign && r->cl == rvc_zero; 1276 1.1 mrg } 1277 1.1 mrg 1278 1.1 mrg /* Compare two floating-point objects for bitwise identity. */ 1279 1.1 mrg 1280 1.1 mrg bool 1281 1.1 mrg real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b) 1282 1.1 mrg { 1283 1.1 mrg int i; 1284 1.1 mrg 1285 1.1 mrg if (a->cl != b->cl) 1286 1.1 mrg return false; 1287 1.1 mrg if (a->sign != b->sign) 1288 1.1 mrg return false; 1289 1.1 mrg 1290 1.1 mrg switch (a->cl) 1291 1.1 mrg { 1292 1.1 mrg case rvc_zero: 1293 1.1 mrg case rvc_inf: 1294 1.1 mrg return true; 1295 1.1 mrg 1296 1.1 mrg case rvc_normal: 1297 1.1 mrg if (a->decimal != b->decimal) 1298 1.1 mrg return false; 1299 1.1 mrg if (REAL_EXP (a) != REAL_EXP (b)) 1300 1.1 mrg return false; 1301 1.1 mrg break; 1302 1.1 mrg 1303 1.1 mrg case rvc_nan: 1304 1.1 mrg if (a->signalling != b->signalling) 1305 1.1 mrg return false; 1306 1.1 mrg /* The significand is ignored for canonical NaNs. */ 1307 1.1 mrg if (a->canonical || b->canonical) 1308 1.1 mrg return a->canonical == b->canonical; 1309 1.1 mrg break; 1310 1.1 mrg 1311 1.1 mrg default: 1312 1.1 mrg gcc_unreachable (); 1313 1.1 mrg } 1314 1.1 mrg 1315 1.1 mrg for (i = 0; i < SIGSZ; ++i) 1316 1.1 mrg if (a->sig[i] != b->sig[i]) 1317 1.1 mrg return false; 1318 1.1 mrg 1319 1.1 mrg return true; 1320 1.1 mrg } 1321 1.1 mrg 1322 1.1 mrg /* Try to change R into its exact multiplicative inverse in format FMT. 1323 1.1 mrg Return true if successful. */ 1324 1.1 mrg 1325 1.1 mrg bool 1326 1.1 mrg exact_real_inverse (format_helper fmt, REAL_VALUE_TYPE *r) 1327 1.1 mrg { 1328 1.1 mrg const REAL_VALUE_TYPE *one = real_digit (1); 1329 1.1 mrg REAL_VALUE_TYPE u; 1330 1.1 mrg int i; 1331 1.1 mrg 1332 1.1 mrg if (r->cl != rvc_normal) 1333 1.1 mrg return false; 1334 1.1 mrg 1335 1.1 mrg /* Check for a power of two: all significand bits zero except the MSB. */ 1336 1.1 mrg for (i = 0; i < SIGSZ-1; ++i) 1337 1.1 mrg if (r->sig[i] != 0) 1338 1.1 mrg return false; 1339 1.1 mrg if (r->sig[SIGSZ-1] != SIG_MSB) 1340 1.1 mrg return false; 1341 1.1 mrg 1342 1.1 mrg /* Find the inverse and truncate to the required format. */ 1343 1.1 mrg do_divide (&u, one, r); 1344 1.1 mrg real_convert (&u, fmt, &u); 1345 1.1 mrg 1346 1.1 mrg /* The rounding may have overflowed. */ 1347 1.1 mrg if (u.cl != rvc_normal) 1348 1.1 mrg return false; 1349 1.1 mrg for (i = 0; i < SIGSZ-1; ++i) 1350 1.1 mrg if (u.sig[i] != 0) 1351 1.1 mrg return false; 1352 1.1 mrg if (u.sig[SIGSZ-1] != SIG_MSB) 1353 1.1 mrg return false; 1354 1.1 mrg 1355 1.1 mrg *r = u; 1356 1.1 mrg return true; 1357 1.1 mrg } 1358 1.1 mrg 1359 1.1 mrg /* Return true if arithmetic on values in IMODE that were promoted 1360 1.1 mrg from values in TMODE is equivalent to direct arithmetic on values 1361 1.1 mrg in TMODE. */ 1362 1.1 mrg 1363 1.1 mrg bool 1364 1.1 mrg real_can_shorten_arithmetic (machine_mode imode, machine_mode tmode) 1365 1.1 mrg { 1366 1.1 mrg const struct real_format *tfmt, *ifmt; 1367 1.1 mrg tfmt = REAL_MODE_FORMAT (tmode); 1368 1.1 mrg ifmt = REAL_MODE_FORMAT (imode); 1369 1.1 mrg /* These conditions are conservative rather than trying to catch the 1370 1.1 mrg exact boundary conditions; the main case to allow is IEEE float 1371 1.1 mrg and double. */ 1372 1.1 mrg return (ifmt->b == tfmt->b 1373 1.1 mrg && ifmt->p > 2 * tfmt->p 1374 1.1 mrg && ifmt->emin < 2 * tfmt->emin - tfmt->p - 2 1375 1.1 mrg && ifmt->emin < tfmt->emin - tfmt->emax - tfmt->p - 2 1376 1.1 mrg && ifmt->emax > 2 * tfmt->emax + 2 1377 1.1 mrg && ifmt->emax > tfmt->emax - tfmt->emin + tfmt->p + 2 1378 1.1 mrg && ifmt->round_towards_zero == tfmt->round_towards_zero 1379 1.1 mrg && (ifmt->has_sign_dependent_rounding 1380 1.1 mrg == tfmt->has_sign_dependent_rounding) 1381 1.1 mrg && ifmt->has_nans >= tfmt->has_nans 1382 1.1 mrg && ifmt->has_inf >= tfmt->has_inf 1383 1.1 mrg && ifmt->has_signed_zero >= tfmt->has_signed_zero 1384 1.1 mrg && !MODE_COMPOSITE_P (tmode) 1385 1.1 mrg && !MODE_COMPOSITE_P (imode)); 1386 1.1 mrg } 1387 1.1 mrg 1388 1.1 mrg /* Render R as an integer. */ 1390 1.1 mrg 1391 1.1 mrg HOST_WIDE_INT 1392 1.1 mrg real_to_integer (const REAL_VALUE_TYPE *r) 1393 1.1 mrg { 1394 1.1 mrg unsigned HOST_WIDE_INT i; 1395 1.1 mrg 1396 1.1 mrg switch (r->cl) 1397 1.1 mrg { 1398 1.1 mrg case rvc_zero: 1399 1.1 mrg underflow: 1400 1.1 mrg return 0; 1401 1.1 mrg 1402 1.1 mrg case rvc_inf: 1403 1.1 mrg case rvc_nan: 1404 1.1 mrg overflow: 1405 1.1 mrg i = HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1); 1406 1.1 mrg if (!r->sign) 1407 1.1 mrg i--; 1408 1.1 mrg return i; 1409 1.1 mrg 1410 1.1 mrg case rvc_normal: 1411 1.1 mrg if (r->decimal) 1412 1.1 mrg return decimal_real_to_integer (r); 1413 1.1 mrg 1414 1.1 mrg if (REAL_EXP (r) <= 0) 1415 1.1 mrg goto underflow; 1416 1.1 mrg /* Only force overflow for unsigned overflow. Signed overflow is 1417 1.1 mrg undefined, so it doesn't matter what we return, and some callers 1418 1.1 mrg expect to be able to use this routine for both signed and 1419 1.1 mrg unsigned conversions. */ 1420 1.1 mrg if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT) 1421 1.1 mrg goto overflow; 1422 1.1 mrg 1423 1.1 mrg if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG) 1424 1.1 mrg i = r->sig[SIGSZ-1]; 1425 1.1 mrg else 1426 1.1 mrg { 1427 1.1 mrg gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG); 1428 1.1 mrg i = r->sig[SIGSZ-1]; 1429 1.1 mrg i = i << (HOST_BITS_PER_LONG - 1) << 1; 1430 1.1 mrg i |= r->sig[SIGSZ-2]; 1431 1.1 mrg } 1432 1.1 mrg 1433 1.1 mrg i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r); 1434 1.1 mrg 1435 1.1 mrg if (r->sign) 1436 1.1 mrg i = -i; 1437 1.1 mrg return i; 1438 1.1 mrg 1439 1.1 mrg default: 1440 1.1 mrg gcc_unreachable (); 1441 1.1 mrg } 1442 1.1 mrg } 1443 1.1 mrg 1444 1.1 mrg /* Likewise, but producing a wide-int of PRECISION. If the value cannot 1445 1.1 mrg be represented in precision, *FAIL is set to TRUE. */ 1446 1.1 mrg 1447 1.1 mrg wide_int 1448 1.1 mrg real_to_integer (const REAL_VALUE_TYPE *r, bool *fail, int precision) 1449 1.1 mrg { 1450 1.1 mrg HOST_WIDE_INT val[2 * WIDE_INT_MAX_ELTS]; 1451 1.1 mrg int exp; 1452 1.1 mrg int words, w; 1453 1.1 mrg wide_int result; 1454 1.1 mrg 1455 1.1 mrg switch (r->cl) 1456 1.1 mrg { 1457 1.1 mrg case rvc_zero: 1458 1.1 mrg underflow: 1459 1.1 mrg return wi::zero (precision); 1460 1.1 mrg 1461 1.1 mrg case rvc_inf: 1462 1.1 mrg case rvc_nan: 1463 1.1 mrg overflow: 1464 1.1 mrg *fail = true; 1465 1.1 mrg 1466 1.1 mrg if (r->sign) 1467 1.1 mrg return wi::set_bit_in_zero (precision - 1, precision); 1468 1.1 mrg else 1469 1.1 mrg return ~wi::set_bit_in_zero (precision - 1, precision); 1470 1.1 mrg 1471 1.1 mrg case rvc_normal: 1472 1.1 mrg if (r->decimal) 1473 1.1 mrg return decimal_real_to_integer (r, fail, precision); 1474 1.1 mrg 1475 1.1 mrg exp = REAL_EXP (r); 1476 1.1 mrg if (exp <= 0) 1477 1.1 mrg goto underflow; 1478 1.1 mrg /* Only force overflow for unsigned overflow. Signed overflow is 1479 1.1 mrg undefined, so it doesn't matter what we return, and some callers 1480 1.1 mrg expect to be able to use this routine for both signed and 1481 1.1 mrg unsigned conversions. */ 1482 1.1 mrg if (exp > precision) 1483 1.1 mrg goto overflow; 1484 1.1 mrg 1485 1.1 mrg /* Put the significand into a wide_int that has precision W, which 1486 1.1 mrg is the smallest HWI-multiple that has at least PRECISION bits. 1487 1.1 mrg This ensures that the top bit of the significand is in the 1488 1.1 mrg top bit of the wide_int. */ 1489 1.1 mrg words = (precision + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT; 1490 1.1 mrg w = words * HOST_BITS_PER_WIDE_INT; 1491 1.1 mrg 1492 1.1 mrg #if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG) 1493 1.1 mrg for (int i = 0; i < words; i++) 1494 1.1 mrg { 1495 1.1 mrg int j = SIGSZ - words + i; 1496 1.1 mrg val[i] = (j < 0) ? 0 : r->sig[j]; 1497 1.1 mrg } 1498 1.1 mrg #else 1499 1.1 mrg gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG); 1500 1.1 mrg for (int i = 0; i < words; i++) 1501 1.1 mrg { 1502 1.1 mrg int j = SIGSZ - (words * 2) + (i * 2); 1503 1.1 mrg if (j < 0) 1504 1.1 mrg val[i] = 0; 1505 1.1 mrg else 1506 1.1 mrg val[i] = r->sig[j]; 1507 1.1 mrg j += 1; 1508 1.1 mrg if (j >= 0) 1509 1.1 mrg val[i] |= (unsigned HOST_WIDE_INT) r->sig[j] << HOST_BITS_PER_LONG; 1510 1.1 mrg } 1511 1.1 mrg #endif 1512 1.1 mrg /* Shift the value into place and truncate to the desired precision. */ 1513 1.1 mrg result = wide_int::from_array (val, words, w); 1514 1.1 mrg result = wi::lrshift (result, w - exp); 1515 1.1 mrg result = wide_int::from (result, precision, UNSIGNED); 1516 1.1 mrg 1517 1.1 mrg if (r->sign) 1518 1.1 mrg return -result; 1519 1.1 mrg else 1520 1.1 mrg return result; 1521 1.1 mrg 1522 1.1 mrg default: 1523 1.1 mrg gcc_unreachable (); 1524 1.1 mrg } 1525 1.1 mrg } 1526 1.1 mrg 1527 1.1 mrg /* A subroutine of real_to_decimal. Compute the quotient and remainder 1528 1.1 mrg of NUM / DEN. Return the quotient and place the remainder in NUM. 1529 1.1 mrg It is expected that NUM / DEN are close enough that the quotient is 1530 1.1 mrg small. */ 1531 1.1 mrg 1532 1.1 mrg static unsigned long 1533 1.1 mrg rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den) 1534 1.1 mrg { 1535 1.1 mrg unsigned long q, msb; 1536 1.1 mrg int expn = REAL_EXP (num), expd = REAL_EXP (den); 1537 1.1 mrg 1538 1.1 mrg if (expn < expd) 1539 1.1 mrg return 0; 1540 1.1 mrg 1541 1.1 mrg q = msb = 0; 1542 1.1 mrg goto start; 1543 1.1 mrg do 1544 1.1 mrg { 1545 1.1 mrg msb = num->sig[SIGSZ-1] & SIG_MSB; 1546 1.1 mrg q <<= 1; 1547 1.1 mrg lshift_significand_1 (num, num); 1548 1.1 mrg start: 1549 1.1 mrg if (msb || cmp_significands (num, den) >= 0) 1550 1.1 mrg { 1551 1.1 mrg sub_significands (num, num, den, 0); 1552 1.1 mrg q |= 1; 1553 1.1 mrg } 1554 1.1 mrg } 1555 1.1 mrg while (--expn >= expd); 1556 1.1 mrg 1557 1.1 mrg SET_REAL_EXP (num, expd); 1558 1.1 mrg normalize (num); 1559 1.1 mrg 1560 1.1 mrg return q; 1561 1.1 mrg } 1562 1.1 mrg 1563 1.1 mrg /* Render R as a decimal floating point constant. Emit DIGITS significant 1564 1.1 mrg digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the 1565 1.1 mrg maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing 1566 1.1 mrg zeros. If MODE is VOIDmode, round to nearest value. Otherwise, round 1567 1.1 mrg to a string that, when parsed back in mode MODE, yields the same value. */ 1568 1.1 mrg 1569 1.1 mrg #define M_LOG10_2 0.30102999566398119521 1570 1.1 mrg 1571 1.1 mrg void 1572 1.1 mrg real_to_decimal_for_mode (char *str, const REAL_VALUE_TYPE *r_orig, 1573 1.1 mrg size_t buf_size, size_t digits, 1574 1.1 mrg int crop_trailing_zeros, machine_mode mode) 1575 1.1 mrg { 1576 1.1 mrg const struct real_format *fmt = NULL; 1577 1.1 mrg const REAL_VALUE_TYPE *one, *ten; 1578 1.1 mrg REAL_VALUE_TYPE r, pten, u, v; 1579 1.1 mrg int dec_exp, cmp_one, digit; 1580 1.1 mrg size_t max_digits; 1581 1.1 mrg char *p, *first, *last; 1582 1.1 mrg bool sign; 1583 1.1 mrg bool round_up; 1584 1.1 mrg 1585 1.1 mrg if (mode != VOIDmode) 1586 1.1 mrg { 1587 1.1 mrg fmt = REAL_MODE_FORMAT (mode); 1588 1.1 mrg gcc_assert (fmt); 1589 1.1 mrg } 1590 1.1 mrg 1591 1.1 mrg r = *r_orig; 1592 1.1 mrg switch (r.cl) 1593 1.1 mrg { 1594 1.1 mrg case rvc_zero: 1595 1.1 mrg strcpy (str, (r.sign ? "-0.0" : "0.0")); 1596 1.1 mrg return; 1597 1.1 mrg case rvc_normal: 1598 1.1 mrg break; 1599 1.1 mrg case rvc_inf: 1600 1.1 mrg strcpy (str, (r.sign ? "-Inf" : "+Inf")); 1601 1.1 mrg return; 1602 1.1 mrg case rvc_nan: 1603 1.1 mrg /* ??? Print the significand as well, if not canonical? */ 1604 1.1 mrg sprintf (str, "%c%cNaN", (r_orig->sign ? '-' : '+'), 1605 1.1 mrg (r_orig->signalling ? 'S' : 'Q')); 1606 1.1 mrg return; 1607 1.1 mrg default: 1608 1.1 mrg gcc_unreachable (); 1609 1.1 mrg } 1610 1.1 mrg 1611 1.1 mrg if (r.decimal) 1612 1.1 mrg { 1613 1.1 mrg decimal_real_to_decimal (str, &r, buf_size, digits, crop_trailing_zeros); 1614 1.1 mrg return; 1615 1.1 mrg } 1616 1.1 mrg 1617 1.1 mrg /* Bound the number of digits printed by the size of the representation. */ 1618 1.1 mrg max_digits = SIGNIFICAND_BITS * M_LOG10_2; 1619 1.1 mrg if (digits == 0 || digits > max_digits) 1620 1.1 mrg digits = max_digits; 1621 1.1 mrg 1622 1.1 mrg /* Estimate the decimal exponent, and compute the length of the string it 1623 1.1 mrg will print as. Be conservative and add one to account for possible 1624 1.1 mrg overflow or rounding error. */ 1625 1.1 mrg dec_exp = REAL_EXP (&r) * M_LOG10_2; 1626 1.1 mrg for (max_digits = 1; dec_exp ; max_digits++) 1627 1.1 mrg dec_exp /= 10; 1628 1.1 mrg 1629 1.1 mrg /* Bound the number of digits printed by the size of the output buffer. */ 1630 1.1 mrg max_digits = buf_size - 1 - 1 - 2 - max_digits - 1; 1631 1.1 mrg gcc_assert (max_digits <= buf_size); 1632 1.1 mrg if (digits > max_digits) 1633 1.1 mrg digits = max_digits; 1634 1.1 mrg 1635 1.1 mrg one = real_digit (1); 1636 1.1 mrg ten = ten_to_ptwo (0); 1637 1.1 mrg 1638 1.1 mrg sign = r.sign; 1639 1.1 mrg r.sign = 0; 1640 1.1 mrg 1641 1.1 mrg dec_exp = 0; 1642 1.1 mrg pten = *one; 1643 1.1 mrg 1644 1.1 mrg cmp_one = do_compare (&r, one, 0); 1645 1.1 mrg if (cmp_one > 0) 1646 1.1 mrg { 1647 1.1 mrg int m; 1648 1.1 mrg 1649 1.1 mrg /* Number is greater than one. Convert significand to an integer 1650 1.1 mrg and strip trailing decimal zeros. */ 1651 1.1 mrg 1652 1.1 mrg u = r; 1653 1.1 mrg SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1); 1654 1.1 mrg 1655 1.1 mrg /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */ 1656 1.1 mrg m = floor_log2 (max_digits); 1657 1.1 mrg 1658 1.1 mrg /* Iterate over the bits of the possible powers of 10 that might 1659 1.1 mrg be present in U and eliminate them. That is, if we find that 1660 1.1 mrg 10**2**M divides U evenly, keep the division and increase 1661 1.1 mrg DEC_EXP by 2**M. */ 1662 1.1 mrg do 1663 1.1 mrg { 1664 1.1 mrg REAL_VALUE_TYPE t; 1665 1.1 mrg 1666 1.1 mrg do_divide (&t, &u, ten_to_ptwo (m)); 1667 1.1 mrg do_fix_trunc (&v, &t); 1668 1.1 mrg if (cmp_significands (&v, &t) == 0) 1669 1.1 mrg { 1670 1.1 mrg u = t; 1671 1.1 mrg dec_exp += 1 << m; 1672 1.1 mrg } 1673 1.1 mrg } 1674 1.1 mrg while (--m >= 0); 1675 1.1 mrg 1676 1.1 mrg /* Revert the scaling to integer that we performed earlier. */ 1677 1.1 mrg SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r) 1678 1.1 mrg - (SIGNIFICAND_BITS - 1)); 1679 1.1 mrg r = u; 1680 1.1 mrg 1681 1.1 mrg /* Find power of 10. Do this by dividing out 10**2**M when 1682 1.1 mrg this is larger than the current remainder. Fill PTEN with 1683 1.1 mrg the power of 10 that we compute. */ 1684 1.1 mrg if (REAL_EXP (&r) > 0) 1685 1.1 mrg { 1686 1.1 mrg m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1; 1687 1.1 mrg do 1688 1.1 mrg { 1689 1.1 mrg const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m); 1690 1.1 mrg if (do_compare (&u, ptentwo, 0) >= 0) 1691 1.1 mrg { 1692 1.1 mrg do_divide (&u, &u, ptentwo); 1693 1.1 mrg do_multiply (&pten, &pten, ptentwo); 1694 1.1 mrg dec_exp += 1 << m; 1695 1.1 mrg } 1696 1.1 mrg } 1697 1.1 mrg while (--m >= 0); 1698 1.1 mrg } 1699 1.1 mrg else 1700 1.1 mrg /* We managed to divide off enough tens in the above reduction 1701 1.1 mrg loop that we've now got a negative exponent. Fall into the 1702 1.1 mrg less-than-one code to compute the proper value for PTEN. */ 1703 1.1 mrg cmp_one = -1; 1704 1.1 mrg } 1705 1.1 mrg if (cmp_one < 0) 1706 1.1 mrg { 1707 1.1 mrg int m; 1708 1.1 mrg 1709 1.1 mrg /* Number is less than one. Pad significand with leading 1710 1.1 mrg decimal zeros. */ 1711 1.1 mrg 1712 1.1 mrg v = r; 1713 1.1 mrg while (1) 1714 1.1 mrg { 1715 1.1 mrg /* Stop if we'd shift bits off the bottom. */ 1716 1.1 mrg if (v.sig[0] & 7) 1717 1.1 mrg break; 1718 1.1 mrg 1719 1.1 mrg do_multiply (&u, &v, ten); 1720 1.1 mrg 1721 1.1 mrg /* Stop if we're now >= 1 or zero. */ 1722 1.1 mrg if (REAL_EXP (&u) > 0 || u.cl == rvc_zero) 1723 1.1 mrg break; 1724 1.1 mrg 1725 1.1 mrg v = u; 1726 1.1 mrg dec_exp -= 1; 1727 1.1 mrg } 1728 1.1 mrg r = v; 1729 1.1 mrg 1730 1.1 mrg /* Find power of 10. Do this by multiplying in P=10**2**M when 1731 1.1 mrg the current remainder is smaller than 1/P. Fill PTEN with the 1732 1.1 mrg power of 10 that we compute. */ 1733 1.1 mrg m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1; 1734 1.1 mrg do 1735 1.1 mrg { 1736 1.1 mrg const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m); 1737 1.1 mrg const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m); 1738 1.1 mrg 1739 1.1 mrg if (do_compare (&v, ptenmtwo, 0) <= 0) 1740 1.1 mrg { 1741 1.1 mrg do_multiply (&v, &v, ptentwo); 1742 1.1 mrg do_multiply (&pten, &pten, ptentwo); 1743 1.1 mrg dec_exp -= 1 << m; 1744 1.1 mrg } 1745 1.1 mrg } 1746 1.1 mrg while (--m >= 0); 1747 1.1 mrg 1748 1.1 mrg /* Invert the positive power of 10 that we've collected so far. */ 1749 1.1 mrg do_divide (&pten, one, &pten); 1750 1.1 mrg } 1751 1.1 mrg 1752 1.1 mrg p = str; 1753 1.1 mrg if (sign) 1754 1.1 mrg *p++ = '-'; 1755 1.1 mrg first = p++; 1756 1.1 mrg 1757 1.1 mrg /* At this point, PTEN should contain the nearest power of 10 smaller 1758 1.1 mrg than R, such that this division produces the first digit. 1759 1.1 mrg 1760 1.1 mrg Using a divide-step primitive that returns the complete integral 1761 1.1 mrg remainder avoids the rounding error that would be produced if 1762 1.1 mrg we were to use do_divide here and then simply multiply by 10 for 1763 1.1 mrg each subsequent digit. */ 1764 1.1 mrg 1765 1.1 mrg digit = rtd_divmod (&r, &pten); 1766 1.1 mrg 1767 1.1 mrg /* Be prepared for error in that division via underflow ... */ 1768 1.1 mrg if (digit == 0 && cmp_significand_0 (&r)) 1769 1.1 mrg { 1770 1.1 mrg /* Multiply by 10 and try again. */ 1771 1.1 mrg do_multiply (&r, &r, ten); 1772 1.1 mrg digit = rtd_divmod (&r, &pten); 1773 1.1 mrg dec_exp -= 1; 1774 1.1 mrg gcc_assert (digit != 0); 1775 1.1 mrg } 1776 1.1 mrg 1777 1.1 mrg /* ... or overflow. */ 1778 1.1 mrg if (digit == 10) 1779 1.1 mrg { 1780 1.1 mrg *p++ = '1'; 1781 1.1 mrg if (--digits > 0) 1782 1.1 mrg *p++ = '0'; 1783 1.1 mrg dec_exp += 1; 1784 1.1 mrg } 1785 1.1 mrg else 1786 1.1 mrg { 1787 1.1 mrg gcc_assert (digit <= 10); 1788 1.1 mrg *p++ = digit + '0'; 1789 1.1 mrg } 1790 1.1 mrg 1791 1.1 mrg /* Generate subsequent digits. */ 1792 1.1 mrg while (--digits > 0) 1793 1.1 mrg { 1794 1.1 mrg do_multiply (&r, &r, ten); 1795 1.1 mrg digit = rtd_divmod (&r, &pten); 1796 1.1 mrg *p++ = digit + '0'; 1797 1.1 mrg } 1798 1.1 mrg last = p; 1799 1.1 mrg 1800 1.1 mrg /* Generate one more digit with which to do rounding. */ 1801 1.1 mrg do_multiply (&r, &r, ten); 1802 1.1 mrg digit = rtd_divmod (&r, &pten); 1803 1.1 mrg 1804 1.1 mrg /* Round the result. */ 1805 1.1 mrg if (fmt && fmt->round_towards_zero) 1806 1.1 mrg { 1807 1.1 mrg /* If the format uses round towards zero when parsing the string 1808 1.1 mrg back in, we need to always round away from zero here. */ 1809 1.1 mrg if (cmp_significand_0 (&r)) 1810 1.1 mrg digit++; 1811 1.1 mrg round_up = digit > 0; 1812 1.1 mrg } 1813 1.1 mrg else 1814 1.1 mrg { 1815 1.1 mrg if (digit == 5) 1816 1.1 mrg { 1817 1.1 mrg /* Round to nearest. If R is nonzero there are additional 1818 1.1 mrg nonzero digits to be extracted. */ 1819 1.1 mrg if (cmp_significand_0 (&r)) 1820 1.1 mrg digit++; 1821 1.1 mrg /* Round to even. */ 1822 1.1 mrg else if ((p[-1] - '0') & 1) 1823 1.1 mrg digit++; 1824 1.1 mrg } 1825 1.1 mrg 1826 1.1 mrg round_up = digit > 5; 1827 1.1 mrg } 1828 1.1 mrg 1829 1.1 mrg if (round_up) 1830 1.1 mrg { 1831 1.1 mrg while (p > first) 1832 1.1 mrg { 1833 1.1 mrg digit = *--p; 1834 1.1 mrg if (digit == '9') 1835 1.1 mrg *p = '0'; 1836 1.1 mrg else 1837 1.1 mrg { 1838 1.1 mrg *p = digit + 1; 1839 1.1 mrg break; 1840 1.1 mrg } 1841 1.1 mrg } 1842 1.1 mrg 1843 1.1 mrg /* Carry out of the first digit. This means we had all 9's and 1844 1.1 mrg now have all 0's. "Prepend" a 1 by overwriting the first 0. */ 1845 1.1 mrg if (p == first) 1846 1.1 mrg { 1847 1.1 mrg first[1] = '1'; 1848 1.1 mrg dec_exp++; 1849 1.1 mrg } 1850 1.1 mrg } 1851 1.1 mrg 1852 1.1 mrg /* Insert the decimal point. */ 1853 1.1 mrg first[0] = first[1]; 1854 1.1 mrg first[1] = '.'; 1855 1.1 mrg 1856 1.1 mrg /* If requested, drop trailing zeros. Never crop past "1.0". */ 1857 1.1 mrg if (crop_trailing_zeros) 1858 1.1 mrg while (last > first + 3 && last[-1] == '0') 1859 1.1 mrg last--; 1860 1.1 mrg 1861 1.1 mrg /* Append the exponent. */ 1862 1.1 mrg sprintf (last, "e%+d", dec_exp); 1863 1.1 mrg 1864 1.1 mrg /* Verify that we can read the original value back in. */ 1865 1.1 mrg if (flag_checking && mode != VOIDmode) 1866 1.1 mrg { 1867 1.1 mrg real_from_string (&r, str); 1868 1.1 mrg real_convert (&r, mode, &r); 1869 1.1 mrg gcc_assert (real_identical (&r, r_orig)); 1870 1.1 mrg } 1871 1.1 mrg } 1872 1.1 mrg 1873 1.1 mrg /* Likewise, except always uses round-to-nearest. */ 1874 1.1 mrg 1875 1.1 mrg void 1876 1.1 mrg real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size, 1877 1.1 mrg size_t digits, int crop_trailing_zeros) 1878 1.1 mrg { 1879 1.1 mrg real_to_decimal_for_mode (str, r_orig, buf_size, 1880 1.1 mrg digits, crop_trailing_zeros, VOIDmode); 1881 1.1 mrg } 1882 1.1 mrg 1883 1.1 mrg /* Render R as a hexadecimal floating point constant. Emit DIGITS 1884 1.1 mrg significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0, 1885 1.1 mrg choose the maximum for the representation. If CROP_TRAILING_ZEROS, 1886 1.1 mrg strip trailing zeros. */ 1887 1.1 mrg 1888 1.1 mrg void 1889 1.1 mrg real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size, 1890 1.1 mrg size_t digits, int crop_trailing_zeros) 1891 1.1 mrg { 1892 1.1 mrg int i, j, exp = REAL_EXP (r); 1893 1.1 mrg char *p, *first; 1894 1.1 mrg char exp_buf[16]; 1895 1.1 mrg size_t max_digits; 1896 1.1 mrg 1897 1.1 mrg switch (r->cl) 1898 1.1 mrg { 1899 1.1 mrg case rvc_zero: 1900 1.1 mrg exp = 0; 1901 1.1 mrg break; 1902 1.1 mrg case rvc_normal: 1903 1.1 mrg break; 1904 1.1 mrg case rvc_inf: 1905 1.1 mrg strcpy (str, (r->sign ? "-Inf" : "+Inf")); 1906 1.1 mrg return; 1907 1.1 mrg case rvc_nan: 1908 1.1 mrg /* ??? Print the significand as well, if not canonical? */ 1909 1.1 mrg sprintf (str, "%c%cNaN", (r->sign ? '-' : '+'), 1910 1.1 mrg (r->signalling ? 'S' : 'Q')); 1911 1.1 mrg return; 1912 1.1 mrg default: 1913 1.1 mrg gcc_unreachable (); 1914 1.1 mrg } 1915 1.1 mrg 1916 1.1 mrg if (r->decimal) 1917 1.1 mrg { 1918 1.1 mrg /* Hexadecimal format for decimal floats is not interesting. */ 1919 1.1 mrg strcpy (str, "N/A"); 1920 1.1 mrg return; 1921 1.1 mrg } 1922 1.1 mrg 1923 1.1 mrg if (digits == 0) 1924 1.1 mrg digits = SIGNIFICAND_BITS / 4; 1925 1.1 mrg 1926 1.1 mrg /* Bound the number of digits printed by the size of the output buffer. */ 1927 1.1 mrg 1928 1.1 mrg sprintf (exp_buf, "p%+d", exp); 1929 1.1 mrg max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1; 1930 1.1 mrg gcc_assert (max_digits <= buf_size); 1931 1.1 mrg if (digits > max_digits) 1932 1.1 mrg digits = max_digits; 1933 1.1 mrg 1934 1.1 mrg p = str; 1935 1.1 mrg if (r->sign) 1936 1.1 mrg *p++ = '-'; 1937 1.1 mrg *p++ = '0'; 1938 1.1 mrg *p++ = 'x'; 1939 1.1 mrg *p++ = '0'; 1940 1.1 mrg *p++ = '.'; 1941 1.1 mrg first = p; 1942 1.1 mrg 1943 1.1 mrg for (i = SIGSZ - 1; i >= 0; --i) 1944 1.1 mrg for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4) 1945 1.1 mrg { 1946 1.1 mrg *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15]; 1947 1.1 mrg if (--digits == 0) 1948 1.1 mrg goto out; 1949 1.1 mrg } 1950 1.1 mrg 1951 1.1 mrg out: 1952 1.1 mrg if (crop_trailing_zeros) 1953 1.1 mrg while (p > first + 1 && p[-1] == '0') 1954 1.1 mrg p--; 1955 1.1 mrg 1956 1.1 mrg sprintf (p, "p%+d", exp); 1957 1.1 mrg } 1958 1.1 mrg 1959 1.1 mrg /* Initialize R from a decimal or hexadecimal string. The string is 1960 1.1 mrg assumed to have been syntax checked already. Return -1 if the 1961 1.1 mrg value underflows, +1 if overflows, and 0 otherwise. */ 1962 1.1 mrg 1963 1.1 mrg int 1964 1.1 mrg real_from_string (REAL_VALUE_TYPE *r, const char *str) 1965 1.1 mrg { 1966 1.1 mrg int exp = 0; 1967 1.1 mrg bool sign = false; 1968 1.1 mrg 1969 1.1 mrg get_zero (r, 0); 1970 1.1 mrg 1971 1.1 mrg if (*str == '-') 1972 1.1 mrg { 1973 1.1 mrg sign = true; 1974 1.1 mrg str++; 1975 1.1 mrg } 1976 1.1 mrg else if (*str == '+') 1977 1.1 mrg str++; 1978 1.1 mrg 1979 1.1 mrg if (startswith (str, "QNaN")) 1980 1.1 mrg { 1981 1.1 mrg get_canonical_qnan (r, sign); 1982 1.1 mrg return 0; 1983 1.1 mrg } 1984 1.1 mrg else if (startswith (str, "SNaN")) 1985 1.1 mrg { 1986 1.1 mrg get_canonical_snan (r, sign); 1987 1.1 mrg return 0; 1988 1.1 mrg } 1989 1.1 mrg else if (startswith (str, "Inf")) 1990 1.1 mrg { 1991 1.1 mrg get_inf (r, sign); 1992 1.1 mrg return 0; 1993 1.1 mrg } 1994 1.1 mrg 1995 1.1 mrg if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) 1996 1.1 mrg { 1997 1.1 mrg /* Hexadecimal floating point. */ 1998 1.1 mrg int pos = SIGNIFICAND_BITS - 4, d; 1999 1.1 mrg 2000 1.1 mrg str += 2; 2001 1.1 mrg 2002 1.1 mrg while (*str == '0') 2003 1.1 mrg str++; 2004 1.1 mrg while (1) 2005 1.1 mrg { 2006 1.1 mrg d = hex_value (*str); 2007 1.1 mrg if (d == _hex_bad) 2008 1.1 mrg break; 2009 1.1 mrg if (pos >= 0) 2010 1.1 mrg { 2011 1.1 mrg r->sig[pos / HOST_BITS_PER_LONG] 2012 1.1 mrg |= (unsigned long) d << (pos % HOST_BITS_PER_LONG); 2013 1.1 mrg pos -= 4; 2014 1.1 mrg } 2015 1.1 mrg else if (d) 2016 1.1 mrg /* Ensure correct rounding by setting last bit if there is 2017 1.1 mrg a subsequent nonzero digit. */ 2018 1.1 mrg r->sig[0] |= 1; 2019 1.1 mrg exp += 4; 2020 1.1 mrg str++; 2021 1.1 mrg } 2022 1.1 mrg if (*str == '.') 2023 1.1 mrg { 2024 1.1 mrg str++; 2025 1.1 mrg if (pos == SIGNIFICAND_BITS - 4) 2026 1.1 mrg { 2027 1.1 mrg while (*str == '0') 2028 1.1 mrg str++, exp -= 4; 2029 1.1 mrg } 2030 1.1 mrg while (1) 2031 1.1 mrg { 2032 1.1 mrg d = hex_value (*str); 2033 1.1 mrg if (d == _hex_bad) 2034 1.1 mrg break; 2035 1.1 mrg if (pos >= 0) 2036 1.1 mrg { 2037 1.1 mrg r->sig[pos / HOST_BITS_PER_LONG] 2038 1.1 mrg |= (unsigned long) d << (pos % HOST_BITS_PER_LONG); 2039 1.1 mrg pos -= 4; 2040 1.1 mrg } 2041 1.1 mrg else if (d) 2042 1.1 mrg /* Ensure correct rounding by setting last bit if there is 2043 1.1 mrg a subsequent nonzero digit. */ 2044 1.1 mrg r->sig[0] |= 1; 2045 1.1 mrg str++; 2046 1.1 mrg } 2047 1.1 mrg } 2048 1.1 mrg 2049 1.1 mrg /* If the mantissa is zero, ignore the exponent. */ 2050 1.1 mrg if (!cmp_significand_0 (r)) 2051 1.1 mrg goto is_a_zero; 2052 1.1 mrg 2053 1.1 mrg if (*str == 'p' || *str == 'P') 2054 1.1 mrg { 2055 1.1 mrg bool exp_neg = false; 2056 1.1 mrg 2057 1.1 mrg str++; 2058 1.1 mrg if (*str == '-') 2059 1.1 mrg { 2060 1.1 mrg exp_neg = true; 2061 1.1 mrg str++; 2062 1.1 mrg } 2063 1.1 mrg else if (*str == '+') 2064 1.1 mrg str++; 2065 1.1 mrg 2066 1.1 mrg d = 0; 2067 1.1 mrg while (ISDIGIT (*str)) 2068 1.1 mrg { 2069 1.1 mrg d *= 10; 2070 1.1 mrg d += *str - '0'; 2071 1.1 mrg if (d > MAX_EXP) 2072 1.1 mrg { 2073 1.1 mrg /* Overflowed the exponent. */ 2074 1.1 mrg if (exp_neg) 2075 1.1 mrg goto underflow; 2076 1.1 mrg else 2077 1.1 mrg goto overflow; 2078 1.1 mrg } 2079 1.1 mrg str++; 2080 1.1 mrg } 2081 1.1 mrg if (exp_neg) 2082 1.1 mrg d = -d; 2083 1.1 mrg 2084 1.1 mrg exp += d; 2085 1.1 mrg } 2086 1.1 mrg 2087 1.1 mrg r->cl = rvc_normal; 2088 1.1 mrg SET_REAL_EXP (r, exp); 2089 1.1 mrg 2090 1.1 mrg normalize (r); 2091 1.1 mrg } 2092 1.1 mrg else 2093 1.1 mrg { 2094 1.1 mrg /* Decimal floating point. */ 2095 1.1 mrg const char *cstr = str; 2096 1.1 mrg mpfr_t m; 2097 1.1 mrg bool inexact; 2098 1.1 mrg 2099 1.1 mrg while (*cstr == '0') 2100 1.1 mrg cstr++; 2101 1.1 mrg if (*cstr == '.') 2102 1.1 mrg { 2103 1.1 mrg cstr++; 2104 1.1 mrg while (*cstr == '0') 2105 1.1 mrg cstr++; 2106 1.1 mrg } 2107 1.1 mrg 2108 1.1 mrg /* If the mantissa is zero, ignore the exponent. */ 2109 1.1 mrg if (!ISDIGIT (*cstr)) 2110 1.1 mrg goto is_a_zero; 2111 1.1 mrg 2112 1.1 mrg /* Nonzero value, possibly overflowing or underflowing. */ 2113 1.1 mrg mpfr_init2 (m, SIGNIFICAND_BITS); 2114 1.1 mrg inexact = mpfr_strtofr (m, str, NULL, 10, MPFR_RNDZ); 2115 1.1 mrg /* The result should never be a NaN, and because the rounding is 2116 1.1 mrg toward zero should never be an infinity. */ 2117 1.1 mrg gcc_assert (!mpfr_nan_p (m) && !mpfr_inf_p (m)); 2118 1.1 mrg if (mpfr_zero_p (m) || mpfr_get_exp (m) < -MAX_EXP + 4) 2119 1.1 mrg { 2120 1.1 mrg mpfr_clear (m); 2121 1.1 mrg goto underflow; 2122 1.1 mrg } 2123 1.1 mrg else if (mpfr_get_exp (m) > MAX_EXP - 4) 2124 1.1 mrg { 2125 1.1 mrg mpfr_clear (m); 2126 1.1 mrg goto overflow; 2127 1.1 mrg } 2128 1.1 mrg else 2129 1.1 mrg { 2130 1.1 mrg real_from_mpfr (r, m, NULL_TREE, MPFR_RNDZ); 2131 1.1 mrg /* 1 to 3 bits may have been shifted off (with a sticky bit) 2132 1.1 mrg because the hex digits used in real_from_mpfr did not 2133 1.1 mrg start with a digit 8 to f, but the exponent bounds above 2134 1.1 mrg should have avoided underflow or overflow. */ 2135 1.1 mrg gcc_assert (r->cl == rvc_normal); 2136 1.1 mrg /* Set a sticky bit if mpfr_strtofr was inexact. */ 2137 1.1 mrg r->sig[0] |= inexact; 2138 1.1 mrg mpfr_clear (m); 2139 1.1 mrg } 2140 1.1 mrg } 2141 1.1 mrg 2142 1.1 mrg r->sign = sign; 2143 1.1 mrg return 0; 2144 1.1 mrg 2145 1.1 mrg is_a_zero: 2146 1.1 mrg get_zero (r, sign); 2147 1.1 mrg return 0; 2148 1.1 mrg 2149 1.1 mrg underflow: 2150 1.1 mrg get_zero (r, sign); 2151 1.1 mrg return -1; 2152 1.1 mrg 2153 1.1 mrg overflow: 2154 1.1 mrg get_inf (r, sign); 2155 1.1 mrg return 1; 2156 1.1 mrg } 2157 1.1 mrg 2158 1.1 mrg /* Legacy. Similar, but return the result directly. */ 2159 1.1 mrg 2160 1.1 mrg REAL_VALUE_TYPE 2161 1.1 mrg real_from_string2 (const char *s, format_helper fmt) 2162 1.1 mrg { 2163 1.1 mrg REAL_VALUE_TYPE r; 2164 1.1 mrg 2165 1.1 mrg real_from_string (&r, s); 2166 1.1 mrg if (fmt) 2167 1.1 mrg real_convert (&r, fmt, &r); 2168 1.1 mrg 2169 1.1 mrg return r; 2170 1.1 mrg } 2171 1.1 mrg 2172 1.1 mrg /* Initialize R from string S and desired format FMT. */ 2173 1.1 mrg 2174 1.1 mrg void 2175 1.1 mrg real_from_string3 (REAL_VALUE_TYPE *r, const char *s, format_helper fmt) 2176 1.1 mrg { 2177 1.1 mrg if (fmt.decimal_p ()) 2178 1.1 mrg decimal_real_from_string (r, s); 2179 1.1 mrg else 2180 1.1 mrg real_from_string (r, s); 2181 1.1 mrg 2182 1.1 mrg if (fmt) 2183 1.1 mrg real_convert (r, fmt, r); 2184 1.1 mrg } 2185 1.1 mrg 2186 1.1 mrg /* Initialize R from the wide_int VAL_IN. Round it to format FMT if 2187 1.1 mrg FMT is nonnull. */ 2188 1.1 mrg 2189 1.1 mrg void 2190 1.1 mrg real_from_integer (REAL_VALUE_TYPE *r, format_helper fmt, 2191 1.1 mrg const wide_int_ref &val_in, signop sgn) 2192 1.1 mrg { 2193 1.1 mrg if (val_in == 0) 2194 1.1 mrg get_zero (r, 0); 2195 1.1 mrg else 2196 1.1 mrg { 2197 1.1 mrg unsigned int len = val_in.get_precision (); 2198 1.1 mrg int i, j, e = 0; 2199 1.1 mrg int maxbitlen = MAX_BITSIZE_MODE_ANY_INT + HOST_BITS_PER_WIDE_INT; 2200 1.1 mrg const unsigned int realmax = (SIGNIFICAND_BITS / HOST_BITS_PER_WIDE_INT 2201 1.1 mrg * HOST_BITS_PER_WIDE_INT); 2202 1.1 mrg 2203 1.1 mrg memset (r, 0, sizeof (*r)); 2204 1.1 mrg r->cl = rvc_normal; 2205 1.1 mrg r->sign = wi::neg_p (val_in, sgn); 2206 1.1 mrg 2207 1.1 mrg /* We have to ensure we can negate the largest negative number. */ 2208 1.1 mrg wide_int val = wide_int::from (val_in, maxbitlen, sgn); 2209 1.1 mrg 2210 1.1 mrg if (r->sign) 2211 1.1 mrg val = -val; 2212 1.1 mrg 2213 1.1 mrg /* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt 2214 1.1 mrg won't work with precisions that are not a multiple of 2215 1.1 mrg HOST_BITS_PER_WIDE_INT. */ 2216 1.1 mrg len += HOST_BITS_PER_WIDE_INT - 1; 2217 1.1 mrg 2218 1.1 mrg /* Ensure we can represent the largest negative number. */ 2219 1.1 mrg len += 1; 2220 1.1 mrg 2221 1.1 mrg len = len/HOST_BITS_PER_WIDE_INT * HOST_BITS_PER_WIDE_INT; 2222 1.1 mrg 2223 1.1 mrg /* Cap the size to the size allowed by real.h. */ 2224 1.1 mrg if (len > realmax) 2225 1.1 mrg { 2226 1.1 mrg HOST_WIDE_INT cnt_l_z; 2227 1.1 mrg cnt_l_z = wi::clz (val); 2228 1.1 mrg 2229 1.1 mrg if (maxbitlen - cnt_l_z > realmax) 2230 1.1 mrg { 2231 1.1 mrg e = maxbitlen - cnt_l_z - realmax; 2232 1.1 mrg 2233 1.1 mrg /* This value is too large, we must shift it right to 2234 1.1 mrg preserve all the bits we can, and then bump the 2235 1.1 mrg exponent up by that amount. */ 2236 1.1 mrg val = wi::lrshift (val, e); 2237 1.1 mrg } 2238 1.1 mrg len = realmax; 2239 1.1 mrg } 2240 1.1 mrg 2241 1.1 mrg /* Clear out top bits so elt will work with precisions that aren't 2242 1.1 mrg a multiple of HOST_BITS_PER_WIDE_INT. */ 2243 1.1 mrg val = wide_int::from (val, len, sgn); 2244 1.1 mrg len = len / HOST_BITS_PER_WIDE_INT; 2245 1.1 mrg 2246 1.1 mrg SET_REAL_EXP (r, len * HOST_BITS_PER_WIDE_INT + e); 2247 1.1 mrg 2248 1.1 mrg j = SIGSZ - 1; 2249 1.1 mrg if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT) 2250 1.1 mrg for (i = len - 1; i >= 0; i--) 2251 1.1 mrg { 2252 1.1 mrg r->sig[j--] = val.elt (i); 2253 1.1 mrg if (j < 0) 2254 1.1 mrg break; 2255 1.1 mrg } 2256 1.1 mrg else 2257 1.1 mrg { 2258 1.1 mrg gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT); 2259 1.1 mrg for (i = len - 1; i >= 0; i--) 2260 1.1 mrg { 2261 1.1 mrg HOST_WIDE_INT e = val.elt (i); 2262 1.1 mrg r->sig[j--] = e >> (HOST_BITS_PER_LONG - 1) >> 1; 2263 1.1 mrg if (j < 0) 2264 1.1 mrg break; 2265 1.1 mrg r->sig[j--] = e; 2266 1.1 mrg if (j < 0) 2267 1.1 mrg break; 2268 1.1 mrg } 2269 1.1 mrg } 2270 1.1 mrg 2271 1.1 mrg normalize (r); 2272 1.1 mrg } 2273 1.1 mrg 2274 1.1 mrg if (fmt.decimal_p ()) 2275 1.1 mrg decimal_from_integer (r); 2276 1.1 mrg if (fmt) 2277 1.1 mrg real_convert (r, fmt, r); 2278 1.1 mrg } 2279 1.1 mrg 2280 1.1 mrg /* Render R, an integral value, as a floating point constant with no 2281 1.1 mrg specified exponent. */ 2282 1.1 mrg 2283 1.1 mrg static void 2284 1.1 mrg decimal_integer_string (char *str, const REAL_VALUE_TYPE *r_orig, 2285 1.1 mrg size_t buf_size) 2286 1.1 mrg { 2287 1.1 mrg int dec_exp, digit, digits; 2288 1.1 mrg REAL_VALUE_TYPE r, pten; 2289 1.1 mrg char *p; 2290 1.1 mrg bool sign; 2291 1.1 mrg 2292 1.1 mrg r = *r_orig; 2293 1.1 mrg 2294 1.1 mrg if (r.cl == rvc_zero) 2295 1.1 mrg { 2296 1.1 mrg strcpy (str, "0."); 2297 1.1 mrg return; 2298 1.1 mrg } 2299 1.1 mrg 2300 1.1 mrg sign = r.sign; 2301 1.1 mrg r.sign = 0; 2302 1.1 mrg 2303 1.1 mrg dec_exp = REAL_EXP (&r) * M_LOG10_2; 2304 1.1 mrg digits = dec_exp + 1; 2305 1.1 mrg gcc_assert ((digits + 2) < (int)buf_size); 2306 1.1 mrg 2307 1.1 mrg pten = *real_digit (1); 2308 1.1 mrg times_pten (&pten, dec_exp); 2309 1.1 mrg 2310 1.1 mrg p = str; 2311 1.1 mrg if (sign) 2312 1.1 mrg *p++ = '-'; 2313 1.1 mrg 2314 1.1 mrg digit = rtd_divmod (&r, &pten); 2315 1.1 mrg gcc_assert (digit >= 0 && digit <= 9); 2316 1.1 mrg *p++ = digit + '0'; 2317 1.1 mrg while (--digits > 0) 2318 1.1 mrg { 2319 1.1 mrg times_pten (&r, 1); 2320 1.1 mrg digit = rtd_divmod (&r, &pten); 2321 1.1 mrg *p++ = digit + '0'; 2322 1.1 mrg } 2323 1.1 mrg *p++ = '.'; 2324 1.1 mrg *p++ = '\0'; 2325 1.1 mrg } 2326 1.1 mrg 2327 1.1 mrg /* Convert a real with an integral value to decimal float. */ 2328 1.1 mrg 2329 1.1 mrg static void 2330 1.1 mrg decimal_from_integer (REAL_VALUE_TYPE *r) 2331 1.1 mrg { 2332 1.1 mrg char str[256]; 2333 1.1 mrg 2334 1.1 mrg decimal_integer_string (str, r, sizeof (str) - 1); 2335 1.1 mrg decimal_real_from_string (r, str); 2336 1.1 mrg } 2337 1.1 mrg 2338 1.1 mrg /* Returns 10**2**N. */ 2339 1.1 mrg 2340 1.1 mrg static const REAL_VALUE_TYPE * 2341 1.1 mrg ten_to_ptwo (int n) 2342 1.1 mrg { 2343 1.1 mrg static REAL_VALUE_TYPE tens[EXP_BITS]; 2344 1.1 mrg 2345 1.1 mrg gcc_assert (n >= 0); 2346 1.1 mrg gcc_assert (n < EXP_BITS); 2347 1.1 mrg 2348 1.1 mrg if (tens[n].cl == rvc_zero) 2349 1.1 mrg { 2350 1.1 mrg if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4)) 2351 1.1 mrg { 2352 1.1 mrg HOST_WIDE_INT t = 10; 2353 1.1 mrg int i; 2354 1.1 mrg 2355 1.1 mrg for (i = 0; i < n; ++i) 2356 1.1 mrg t *= t; 2357 1.1 mrg 2358 1.1 mrg real_from_integer (&tens[n], VOIDmode, t, UNSIGNED); 2359 1.1 mrg } 2360 1.1 mrg else 2361 1.1 mrg { 2362 1.1 mrg const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1); 2363 1.1 mrg do_multiply (&tens[n], t, t); 2364 1.1 mrg } 2365 1.1 mrg } 2366 1.1 mrg 2367 1.1 mrg return &tens[n]; 2368 1.1 mrg } 2369 1.1 mrg 2370 1.1 mrg /* Returns 10**(-2**N). */ 2371 1.1 mrg 2372 1.1 mrg static const REAL_VALUE_TYPE * 2373 1.1 mrg ten_to_mptwo (int n) 2374 1.1 mrg { 2375 1.1 mrg static REAL_VALUE_TYPE tens[EXP_BITS]; 2376 1.1 mrg 2377 1.1 mrg gcc_assert (n >= 0); 2378 1.1 mrg gcc_assert (n < EXP_BITS); 2379 1.1 mrg 2380 1.1 mrg if (tens[n].cl == rvc_zero) 2381 1.1 mrg do_divide (&tens[n], real_digit (1), ten_to_ptwo (n)); 2382 1.1 mrg 2383 1.1 mrg return &tens[n]; 2384 1.1 mrg } 2385 1.1 mrg 2386 1.1 mrg /* Returns N. */ 2387 1.1 mrg 2388 1.1 mrg static const REAL_VALUE_TYPE * 2389 1.1 mrg real_digit (int n) 2390 1.1 mrg { 2391 1.1 mrg static REAL_VALUE_TYPE num[10]; 2392 1.1 mrg 2393 1.1 mrg gcc_assert (n >= 0); 2394 1.1 mrg gcc_assert (n <= 9); 2395 1.1 mrg 2396 1.1 mrg if (n > 0 && num[n].cl == rvc_zero) 2397 1.1 mrg real_from_integer (&num[n], VOIDmode, n, UNSIGNED); 2398 1.1 mrg 2399 1.1 mrg return &num[n]; 2400 1.1 mrg } 2401 1.1 mrg 2402 1.1 mrg /* Multiply R by 10**EXP. */ 2403 1.1 mrg 2404 1.1 mrg static void 2405 1.1 mrg times_pten (REAL_VALUE_TYPE *r, int exp) 2406 1.1 mrg { 2407 1.1 mrg REAL_VALUE_TYPE pten, *rr; 2408 1.1 mrg bool negative = (exp < 0); 2409 1.1 mrg int i; 2410 1.1 mrg 2411 1.1 mrg if (negative) 2412 1.1 mrg { 2413 1.1 mrg exp = -exp; 2414 1.1 mrg pten = *real_digit (1); 2415 1.1 mrg rr = &pten; 2416 1.1 mrg } 2417 1.1 mrg else 2418 1.1 mrg rr = r; 2419 1.1 mrg 2420 1.1 mrg for (i = 0; exp > 0; ++i, exp >>= 1) 2421 1.1 mrg if (exp & 1) 2422 1.1 mrg do_multiply (rr, rr, ten_to_ptwo (i)); 2423 1.1 mrg 2424 1.1 mrg if (negative) 2425 1.1 mrg do_divide (r, r, &pten); 2426 1.1 mrg } 2427 1.1 mrg 2428 1.1 mrg /* Returns the special REAL_VALUE_TYPE corresponding to 'e'. */ 2429 1.1 mrg 2430 1.1 mrg const REAL_VALUE_TYPE * 2431 1.1 mrg dconst_e_ptr (void) 2432 1.1 mrg { 2433 1.1 mrg static REAL_VALUE_TYPE value; 2434 1.1 mrg 2435 1.1 mrg /* Initialize mathematical constants for constant folding builtins. 2436 1.1 mrg These constants need to be given to at least 160 bits precision. */ 2437 1.1 mrg if (value.cl == rvc_zero) 2438 1.1 mrg { 2439 1.1 mrg mpfr_t m; 2440 1.1 mrg mpfr_init2 (m, SIGNIFICAND_BITS); 2441 1.1 mrg mpfr_set_ui (m, 1, MPFR_RNDN); 2442 1.1 mrg mpfr_exp (m, m, MPFR_RNDN); 2443 1.1 mrg real_from_mpfr (&value, m, NULL_TREE, MPFR_RNDN); 2444 1.1 mrg mpfr_clear (m); 2445 1.1 mrg 2446 1.1 mrg } 2447 1.1 mrg return &value; 2448 1.1 mrg } 2449 1.1 mrg 2450 1.1 mrg /* Returns a cached REAL_VALUE_TYPE corresponding to 1/n, for various n. */ 2451 1.1 mrg 2452 1.1 mrg #define CACHED_FRACTION(NAME, N) \ 2453 1.1 mrg const REAL_VALUE_TYPE * \ 2454 1.1 mrg NAME (void) \ 2455 1.1 mrg { \ 2456 1.1 mrg static REAL_VALUE_TYPE value; \ 2457 1.1 mrg \ 2458 1.1 mrg /* Initialize mathematical constants for constant folding builtins. \ 2459 1.1 mrg These constants need to be given to at least 160 bits \ 2460 1.1 mrg precision. */ \ 2461 1.1 mrg if (value.cl == rvc_zero) \ 2462 1.1 mrg real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (N)); \ 2463 1.1 mrg return &value; \ 2464 1.1 mrg } 2465 1.1 mrg 2466 1.1 mrg CACHED_FRACTION (dconst_third_ptr, 3) 2467 1.1 mrg CACHED_FRACTION (dconst_quarter_ptr, 4) 2468 1.1 mrg CACHED_FRACTION (dconst_sixth_ptr, 6) 2469 1.1 mrg CACHED_FRACTION (dconst_ninth_ptr, 9) 2470 1.1 mrg 2471 1.1 mrg /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */ 2472 1.1 mrg 2473 1.1 mrg const REAL_VALUE_TYPE * 2474 1.1 mrg dconst_sqrt2_ptr (void) 2475 1.1 mrg { 2476 1.1 mrg static REAL_VALUE_TYPE value; 2477 1.1 mrg 2478 1.1 mrg /* Initialize mathematical constants for constant folding builtins. 2479 1.1 mrg These constants need to be given to at least 160 bits precision. */ 2480 1.1 mrg if (value.cl == rvc_zero) 2481 1.1 mrg { 2482 1.1 mrg mpfr_t m; 2483 1.1 mrg mpfr_init2 (m, SIGNIFICAND_BITS); 2484 1.1 mrg mpfr_sqrt_ui (m, 2, MPFR_RNDN); 2485 1.1 mrg real_from_mpfr (&value, m, NULL_TREE, MPFR_RNDN); 2486 1.1 mrg mpfr_clear (m); 2487 1.1 mrg } 2488 1.1 mrg return &value; 2489 1.1 mrg } 2490 1.1 mrg 2491 1.1 mrg /* Fills R with +Inf. */ 2492 1.1 mrg 2493 1.1 mrg void 2494 1.1 mrg real_inf (REAL_VALUE_TYPE *r) 2495 1.1 mrg { 2496 1.1 mrg get_inf (r, 0); 2497 1.1 mrg } 2498 1.1 mrg 2499 1.1 mrg /* Fills R with a NaN whose significand is described by STR. If QUIET, 2500 1.1 mrg we force a QNaN, else we force an SNaN. The string, if not empty, 2501 1.1 mrg is parsed as a number and placed in the significand. Return true 2502 1.1 mrg if the string was successfully parsed. */ 2503 1.1 mrg 2504 1.1 mrg bool 2505 1.1 mrg real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet, 2506 1.1 mrg format_helper fmt) 2507 1.1 mrg { 2508 1.1 mrg if (*str == 0) 2509 1.1 mrg { 2510 1.1 mrg if (quiet) 2511 1.1 mrg get_canonical_qnan (r, 0); 2512 1.1 mrg else 2513 1.1 mrg get_canonical_snan (r, 0); 2514 1.1 mrg } 2515 1.1 mrg else 2516 1.1 mrg { 2517 1.1 mrg int base = 10, d; 2518 1.1 mrg 2519 1.1 mrg memset (r, 0, sizeof (*r)); 2520 1.1 mrg r->cl = rvc_nan; 2521 1.1 mrg 2522 1.1 mrg /* Parse akin to strtol into the significand of R. */ 2523 1.1 mrg 2524 1.1 mrg while (ISSPACE (*str)) 2525 1.1 mrg str++; 2526 1.1 mrg if (*str == '-') 2527 1.1 mrg str++; 2528 1.1 mrg else if (*str == '+') 2529 1.1 mrg str++; 2530 1.1 mrg if (*str == '0') 2531 1.1 mrg { 2532 1.1 mrg str++; 2533 1.1 mrg if (*str == 'x' || *str == 'X') 2534 1.1 mrg { 2535 1.1 mrg base = 16; 2536 1.1 mrg str++; 2537 1.1 mrg } 2538 1.1 mrg else 2539 1.1 mrg base = 8; 2540 1.1 mrg } 2541 1.1 mrg 2542 1.1 mrg while ((d = hex_value (*str)) < base) 2543 1.1 mrg { 2544 1.1 mrg REAL_VALUE_TYPE u; 2545 1.1 mrg 2546 1.1 mrg switch (base) 2547 1.1 mrg { 2548 1.1 mrg case 8: 2549 1.1 mrg lshift_significand (r, r, 3); 2550 1.1 mrg break; 2551 1.1 mrg case 16: 2552 1.1 mrg lshift_significand (r, r, 4); 2553 1.1 mrg break; 2554 1.1 mrg case 10: 2555 1.1 mrg lshift_significand_1 (&u, r); 2556 1.1 mrg lshift_significand (r, r, 3); 2557 1.1 mrg add_significands (r, r, &u); 2558 1.1 mrg break; 2559 1.1 mrg default: 2560 1.1 mrg gcc_unreachable (); 2561 1.1 mrg } 2562 1.1 mrg 2563 1.1 mrg get_zero (&u, 0); 2564 1.1 mrg u.sig[0] = d; 2565 1.1 mrg add_significands (r, r, &u); 2566 1.1 mrg 2567 1.1 mrg str++; 2568 1.1 mrg } 2569 1.1 mrg 2570 1.1 mrg /* Must have consumed the entire string for success. */ 2571 1.1 mrg if (*str != 0) 2572 1.1 mrg return false; 2573 1.1 mrg 2574 1.1 mrg /* Shift the significand into place such that the bits 2575 1.1 mrg are in the most significant bits for the format. */ 2576 1.1 mrg lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan); 2577 1.1 mrg 2578 1.1 mrg /* Our MSB is always unset for NaNs. */ 2579 1.1 mrg r->sig[SIGSZ-1] &= ~SIG_MSB; 2580 1.1 mrg 2581 1.1 mrg /* Force quiet or signaling NaN. */ 2582 1.1 mrg r->signalling = !quiet; 2583 1.1 mrg } 2584 1.1 mrg 2585 1.1 mrg return true; 2586 1.1 mrg } 2587 1.1 mrg 2588 1.1 mrg /* Fills R with the largest finite value representable in mode MODE. 2589 1.1 mrg If SIGN is nonzero, R is set to the most negative finite value. */ 2590 1.1 mrg 2591 1.1 mrg void 2592 1.1 mrg real_maxval (REAL_VALUE_TYPE *r, int sign, machine_mode mode) 2593 1.1 mrg { 2594 1.1 mrg const struct real_format *fmt; 2595 1.1 mrg int np2; 2596 1.1 mrg 2597 1.1 mrg fmt = REAL_MODE_FORMAT (mode); 2598 1.1 mrg gcc_assert (fmt); 2599 1.1 mrg memset (r, 0, sizeof (*r)); 2600 1.1 mrg 2601 1.1 mrg if (fmt->b == 10) 2602 1.1 mrg decimal_real_maxval (r, sign, mode); 2603 1.1 mrg else 2604 1.1 mrg { 2605 1.1 mrg r->cl = rvc_normal; 2606 1.1 mrg r->sign = sign; 2607 1.1 mrg SET_REAL_EXP (r, fmt->emax); 2608 1.1 mrg 2609 1.1 mrg np2 = SIGNIFICAND_BITS - fmt->p; 2610 1.1 mrg memset (r->sig, -1, SIGSZ * sizeof (unsigned long)); 2611 1.1 mrg clear_significand_below (r, np2); 2612 1.1 mrg 2613 1.1 mrg if (fmt->pnan < fmt->p) 2614 1.1 mrg /* This is an IBM extended double format made up of two IEEE 2615 1.1 mrg doubles. The value of the long double is the sum of the 2616 1.1 mrg values of the two parts. The most significant part is 2617 1.1 mrg required to be the value of the long double rounded to the 2618 1.1 mrg nearest double. Rounding means we need a slightly smaller 2619 1.1 mrg value for LDBL_MAX. */ 2620 1.1 mrg clear_significand_bit (r, SIGNIFICAND_BITS - fmt->pnan - 1); 2621 1.1 mrg } 2622 1.1 mrg } 2623 1.1 mrg 2624 1.1 mrg /* Fills R with 2**N. */ 2625 1.1 mrg 2626 1.1 mrg void 2627 1.1 mrg real_2expN (REAL_VALUE_TYPE *r, int n, format_helper fmt) 2628 1.1 mrg { 2629 1.1 mrg memset (r, 0, sizeof (*r)); 2630 1.1 mrg 2631 1.1 mrg n++; 2632 1.1 mrg if (n > MAX_EXP) 2633 1.1 mrg r->cl = rvc_inf; 2634 1.1 mrg else if (n < -MAX_EXP) 2635 1.1 mrg ; 2636 1.1 mrg else 2637 1.1 mrg { 2638 1.1 mrg r->cl = rvc_normal; 2639 1.1 mrg SET_REAL_EXP (r, n); 2640 1.1 mrg r->sig[SIGSZ-1] = SIG_MSB; 2641 1.1 mrg } 2642 1.1 mrg if (fmt.decimal_p ()) 2643 1.1 mrg decimal_real_convert (r, fmt, r); 2644 1.1 mrg } 2645 1.1 mrg 2646 1.1 mrg 2647 1.1 mrg static void 2649 1.1 mrg round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r) 2650 1.1 mrg { 2651 1.1 mrg int p2, np2, i, w; 2652 1.1 mrg int emin2m1, emax2; 2653 1.1 mrg bool round_up = false; 2654 1.1 mrg 2655 1.1 mrg if (r->decimal) 2656 1.1 mrg { 2657 1.1 mrg if (fmt->b == 10) 2658 1.1 mrg { 2659 1.1 mrg decimal_round_for_format (fmt, r); 2660 1.1 mrg return; 2661 1.1 mrg } 2662 1.1 mrg /* FIXME. We can come here via fp_easy_constant 2663 1.1 mrg (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not 2664 1.1 mrg investigated whether this convert needs to be here, or 2665 1.1 mrg something else is missing. */ 2666 1.1 mrg decimal_real_convert (r, REAL_MODE_FORMAT (DFmode), r); 2667 1.1 mrg } 2668 1.1 mrg 2669 1.1 mrg p2 = fmt->p; 2670 1.1 mrg emin2m1 = fmt->emin - 1; 2671 1.1 mrg emax2 = fmt->emax; 2672 1.1 mrg 2673 1.1 mrg np2 = SIGNIFICAND_BITS - p2; 2674 1.1 mrg switch (r->cl) 2675 1.1 mrg { 2676 1.1 mrg underflow: 2677 1.1 mrg get_zero (r, r->sign); 2678 1.1 mrg /* FALLTHRU */ 2679 1.1 mrg case rvc_zero: 2680 1.1 mrg if (!fmt->has_signed_zero) 2681 1.1 mrg r->sign = 0; 2682 1.1 mrg return; 2683 1.1 mrg 2684 1.1 mrg overflow: 2685 1.1 mrg get_inf (r, r->sign); 2686 1.1 mrg case rvc_inf: 2687 1.1 mrg return; 2688 1.1 mrg 2689 1.1 mrg case rvc_nan: 2690 1.1 mrg clear_significand_below (r, np2); 2691 1.1 mrg return; 2692 1.1 mrg 2693 1.1 mrg case rvc_normal: 2694 1.1 mrg break; 2695 1.1 mrg 2696 1.1 mrg default: 2697 1.1 mrg gcc_unreachable (); 2698 1.1 mrg } 2699 1.1 mrg 2700 1.1 mrg /* Check the range of the exponent. If we're out of range, 2701 1.1 mrg either underflow or overflow. */ 2702 1.1 mrg if (REAL_EXP (r) > emax2) 2703 1.1 mrg goto overflow; 2704 1.1 mrg else if (REAL_EXP (r) <= emin2m1) 2705 1.1 mrg { 2706 1.1 mrg int diff; 2707 1.1 mrg 2708 1.1 mrg if (!fmt->has_denorm) 2709 1.1 mrg { 2710 1.1 mrg /* Don't underflow completely until we've had a chance to round. */ 2711 1.1 mrg if (REAL_EXP (r) < emin2m1) 2712 1.1 mrg goto underflow; 2713 1.1 mrg } 2714 1.1 mrg else 2715 1.1 mrg { 2716 1.1 mrg diff = emin2m1 - REAL_EXP (r) + 1; 2717 1.1 mrg if (diff > p2) 2718 1.1 mrg goto underflow; 2719 1.1 mrg 2720 1.1 mrg /* De-normalize the significand. */ 2721 1.1 mrg r->sig[0] |= sticky_rshift_significand (r, r, diff); 2722 1.1 mrg SET_REAL_EXP (r, REAL_EXP (r) + diff); 2723 1.1 mrg } 2724 1.1 mrg } 2725 1.1 mrg 2726 1.1 mrg if (!fmt->round_towards_zero) 2727 1.1 mrg { 2728 1.1 mrg /* There are P2 true significand bits, followed by one guard bit, 2729 1.1 mrg followed by one sticky bit, followed by stuff. Fold nonzero 2730 1.1 mrg stuff into the sticky bit. */ 2731 1.1 mrg unsigned long sticky; 2732 1.1 mrg bool guard, lsb; 2733 1.1 mrg 2734 1.1 mrg sticky = 0; 2735 1.1 mrg for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i) 2736 1.1 mrg sticky |= r->sig[i]; 2737 1.1 mrg sticky |= r->sig[w] 2738 1.1 mrg & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1); 2739 1.1 mrg 2740 1.1 mrg guard = test_significand_bit (r, np2 - 1); 2741 1.1 mrg lsb = test_significand_bit (r, np2); 2742 1.1 mrg 2743 1.1 mrg /* Round to even. */ 2744 1.1 mrg round_up = guard && (sticky || lsb); 2745 1.1 mrg } 2746 1.1 mrg 2747 1.1 mrg if (round_up) 2748 1.1 mrg { 2749 1.1 mrg REAL_VALUE_TYPE u; 2750 1.1 mrg get_zero (&u, 0); 2751 1.1 mrg set_significand_bit (&u, np2); 2752 1.1 mrg 2753 1.1 mrg if (add_significands (r, r, &u)) 2754 1.1 mrg { 2755 1.1 mrg /* Overflow. Means the significand had been all ones, and 2756 1.1 mrg is now all zeros. Need to increase the exponent, and 2757 1.1 mrg possibly re-normalize it. */ 2758 1.1 mrg SET_REAL_EXP (r, REAL_EXP (r) + 1); 2759 1.1 mrg if (REAL_EXP (r) > emax2) 2760 1.1 mrg goto overflow; 2761 1.1 mrg r->sig[SIGSZ-1] = SIG_MSB; 2762 1.1 mrg } 2763 1.1 mrg } 2764 1.1 mrg 2765 1.1 mrg /* Catch underflow that we deferred until after rounding. */ 2766 1.1 mrg if (REAL_EXP (r) <= emin2m1) 2767 1.1 mrg goto underflow; 2768 1.1 mrg 2769 1.1 mrg /* Clear out trailing garbage. */ 2770 1.1 mrg clear_significand_below (r, np2); 2771 1.1 mrg } 2772 1.1 mrg 2773 1.1 mrg /* Extend or truncate to a new format. */ 2774 1.1 mrg 2775 1.1 mrg void 2776 1.1 mrg real_convert (REAL_VALUE_TYPE *r, format_helper fmt, 2777 1.1 mrg const REAL_VALUE_TYPE *a) 2778 1.1 mrg { 2779 1.1 mrg *r = *a; 2780 1.1 mrg 2781 1.1 mrg if (a->decimal || fmt->b == 10) 2782 1.1 mrg decimal_real_convert (r, fmt, a); 2783 1.1 mrg 2784 1.1 mrg round_for_format (fmt, r); 2785 1.1 mrg 2786 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the 2787 1.1 mrg responsibility to avoid the operation if flag_signaling_nans 2788 1.1 mrg is on. */ 2789 1.1 mrg if (r->cl == rvc_nan) 2790 1.1 mrg r->signalling = 0; 2791 1.1 mrg 2792 1.1 mrg /* round_for_format de-normalizes denormals. Undo just that part. */ 2793 1.1 mrg if (r->cl == rvc_normal) 2794 1.1 mrg normalize (r); 2795 1.1 mrg } 2796 1.1 mrg 2797 1.1 mrg /* Legacy. Likewise, except return the struct directly. */ 2798 1.1 mrg 2799 1.1 mrg REAL_VALUE_TYPE 2800 1.1 mrg real_value_truncate (format_helper fmt, REAL_VALUE_TYPE a) 2801 1.1 mrg { 2802 1.1 mrg REAL_VALUE_TYPE r; 2803 1.1 mrg real_convert (&r, fmt, &a); 2804 1.1 mrg return r; 2805 1.1 mrg } 2806 1.1 mrg 2807 1.1 mrg /* Return true if truncating to FMT is exact. */ 2808 1.1 mrg 2809 1.1 mrg bool 2810 1.1 mrg exact_real_truncate (format_helper fmt, const REAL_VALUE_TYPE *a) 2811 1.1 mrg { 2812 1.1 mrg REAL_VALUE_TYPE t; 2813 1.1 mrg int emin2m1; 2814 1.1 mrg 2815 1.1 mrg /* Don't allow conversion to denormals. */ 2816 1.1 mrg emin2m1 = fmt->emin - 1; 2817 1.1 mrg if (REAL_EXP (a) <= emin2m1) 2818 1.1 mrg return false; 2819 1.1 mrg 2820 1.1 mrg /* After conversion to the new format, the value must be identical. */ 2821 1.1 mrg real_convert (&t, fmt, a); 2822 1.1 mrg return real_identical (&t, a); 2823 1.1 mrg } 2824 1.1 mrg 2825 1.1 mrg /* Write R to the given target format. Place the words of the result 2826 1.1 mrg in target word order in BUF. There are always 32 bits in each 2827 1.1 mrg long, no matter the size of the host long. 2828 1.1 mrg 2829 1.1 mrg Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */ 2830 1.1 mrg 2831 1.1 mrg long 2832 1.1 mrg real_to_target (long *buf, const REAL_VALUE_TYPE *r_orig, 2833 1.1 mrg format_helper fmt) 2834 1.1 mrg { 2835 1.1 mrg REAL_VALUE_TYPE r; 2836 1.1 mrg long buf1; 2837 1.1 mrg 2838 1.1 mrg r = *r_orig; 2839 1.1 mrg round_for_format (fmt, &r); 2840 1.1 mrg 2841 1.1 mrg if (!buf) 2842 1.1 mrg buf = &buf1; 2843 1.1 mrg (*fmt->encode) (fmt, buf, &r); 2844 1.1 mrg 2845 1.1 mrg return *buf; 2846 1.1 mrg } 2847 1.1 mrg 2848 1.1 mrg /* Read R from the given target format. Read the words of the result 2849 1.1 mrg in target word order in BUF. There are always 32 bits in each 2850 1.1 mrg long, no matter the size of the host long. */ 2851 1.1 mrg 2852 1.1 mrg void 2853 1.1 mrg real_from_target (REAL_VALUE_TYPE *r, const long *buf, format_helper fmt) 2854 1.1 mrg { 2855 1.1 mrg (*fmt->decode) (fmt, r, buf); 2856 1.1 mrg } 2857 1.1 mrg 2858 1.1 mrg /* Return the number of bits of the largest binary value that the 2859 1.1 mrg significand of FMT will hold. */ 2860 1.1 mrg /* ??? Legacy. Should get access to real_format directly. */ 2861 1.1 mrg 2862 1.1 mrg int 2863 1.1 mrg significand_size (format_helper fmt) 2864 1.1 mrg { 2865 1.1 mrg if (fmt == NULL) 2866 1.1 mrg return 0; 2867 1.1 mrg 2868 1.1 mrg if (fmt->b == 10) 2869 1.1 mrg { 2870 1.1 mrg /* Return the size in bits of the largest binary value that can be 2871 1.1 mrg held by the decimal coefficient for this format. This is one more 2872 1.1 mrg than the number of bits required to hold the largest coefficient 2873 1.1 mrg of this format. */ 2874 1.1 mrg double log2_10 = 3.3219281; 2875 1.1 mrg return fmt->p * log2_10; 2876 1.1 mrg } 2877 1.1 mrg return fmt->p; 2878 1.1 mrg } 2879 1.1 mrg 2880 1.1 mrg /* Return a hash value for the given real value. */ 2881 1.1 mrg /* ??? The "unsigned int" return value is intended to be hashval_t, 2882 1.1 mrg but I didn't want to pull hashtab.h into real.h. */ 2883 1.1 mrg 2884 1.1 mrg unsigned int 2885 1.1 mrg real_hash (const REAL_VALUE_TYPE *r) 2886 1.1 mrg { 2887 1.1 mrg unsigned int h; 2888 1.1 mrg size_t i; 2889 1.1 mrg 2890 1.1 mrg h = r->cl | (r->sign << 2); 2891 1.1 mrg switch (r->cl) 2892 1.1 mrg { 2893 1.1 mrg case rvc_zero: 2894 1.1 mrg case rvc_inf: 2895 1.1 mrg return h; 2896 1.1 mrg 2897 1.1 mrg case rvc_normal: 2898 1.1 mrg h |= (unsigned int)REAL_EXP (r) << 3; 2899 1.1 mrg break; 2900 1.1 mrg 2901 1.1 mrg case rvc_nan: 2902 1.1 mrg if (r->signalling) 2903 1.1 mrg h ^= (unsigned int)-1; 2904 1.1 mrg if (r->canonical) 2905 1.1 mrg return h; 2906 1.1 mrg break; 2907 1.1 mrg 2908 1.1 mrg default: 2909 1.1 mrg gcc_unreachable (); 2910 1.1 mrg } 2911 1.1 mrg 2912 1.1 mrg if (sizeof (unsigned long) > sizeof (unsigned int)) 2913 1.1 mrg for (i = 0; i < SIGSZ; ++i) 2914 1.1 mrg { 2915 1.1 mrg unsigned long s = r->sig[i]; 2916 1.1 mrg h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2)); 2917 1.1 mrg } 2918 1.1 mrg else 2919 1.1 mrg for (i = 0; i < SIGSZ; ++i) 2920 1.1 mrg h ^= r->sig[i]; 2921 1.1 mrg 2922 1.1 mrg return h; 2923 1.1 mrg } 2924 1.1 mrg 2925 1.1 mrg /* IEEE single-precision format. */ 2927 1.1 mrg 2928 1.1 mrg static void encode_ieee_single (const struct real_format *fmt, 2929 1.1 mrg long *, const REAL_VALUE_TYPE *); 2930 1.1 mrg static void decode_ieee_single (const struct real_format *, 2931 1.1 mrg REAL_VALUE_TYPE *, const long *); 2932 1.1 mrg 2933 1.1 mrg static void 2934 1.1 mrg encode_ieee_single (const struct real_format *fmt, long *buf, 2935 1.1 mrg const REAL_VALUE_TYPE *r) 2936 1.1 mrg { 2937 1.1 mrg unsigned long image, sig, exp; 2938 1.1 mrg unsigned long sign = r->sign; 2939 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0; 2940 1.1 mrg 2941 1.1 mrg image = sign << 31; 2942 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff; 2943 1.1 mrg 2944 1.1 mrg switch (r->cl) 2945 1.1 mrg { 2946 1.1 mrg case rvc_zero: 2947 1.1 mrg break; 2948 1.1 mrg 2949 1.1 mrg case rvc_inf: 2950 1.1 mrg if (fmt->has_inf) 2951 1.1 mrg image |= 255 << 23; 2952 1.1 mrg else 2953 1.1 mrg image |= 0x7fffffff; 2954 1.1 mrg break; 2955 1.1 mrg 2956 1.1 mrg case rvc_nan: 2957 1.1 mrg if (fmt->has_nans) 2958 1.1 mrg { 2959 1.1 mrg if (r->canonical) 2960 1.1 mrg sig = (fmt->canonical_nan_lsbs_set ? (1 << 22) - 1 : 0); 2961 1.1 mrg if (r->signalling == fmt->qnan_msb_set) 2962 1.1 mrg sig &= ~(1 << 22); 2963 1.1 mrg else 2964 1.1 mrg sig |= 1 << 22; 2965 1.1 mrg if (sig == 0) 2966 1.1 mrg sig = 1 << 21; 2967 1.1 mrg 2968 1.1 mrg image |= 255 << 23; 2969 1.1 mrg image |= sig; 2970 1.1 mrg } 2971 1.1 mrg else 2972 1.1 mrg image |= 0x7fffffff; 2973 1.1 mrg break; 2974 1.1 mrg 2975 1.1 mrg case rvc_normal: 2976 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp, 2977 1.1 mrg whereas the intermediate representation is 0.F x 2**exp. 2978 1.1 mrg Which means we're off by one. */ 2979 1.1 mrg if (denormal) 2980 1.1 mrg exp = 0; 2981 1.1 mrg else 2982 1.1 mrg exp = REAL_EXP (r) + 127 - 1; 2983 1.1 mrg image |= exp << 23; 2984 1.1 mrg image |= sig; 2985 1.1 mrg break; 2986 1.1 mrg 2987 1.1 mrg default: 2988 1.1 mrg gcc_unreachable (); 2989 1.1 mrg } 2990 1.1 mrg 2991 1.1 mrg buf[0] = image; 2992 1.1 mrg } 2993 1.1 mrg 2994 1.1 mrg static void 2995 1.1 mrg decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r, 2996 1.1 mrg const long *buf) 2997 1.1 mrg { 2998 1.1 mrg unsigned long image = buf[0] & 0xffffffff; 2999 1.1 mrg bool sign = (image >> 31) & 1; 3000 1.1 mrg int exp = (image >> 23) & 0xff; 3001 1.1 mrg 3002 1.1 mrg memset (r, 0, sizeof (*r)); 3003 1.1 mrg image <<= HOST_BITS_PER_LONG - 24; 3004 1.1 mrg image &= ~SIG_MSB; 3005 1.1 mrg 3006 1.1 mrg if (exp == 0) 3007 1.1 mrg { 3008 1.1 mrg if (image && fmt->has_denorm) 3009 1.1 mrg { 3010 1.1 mrg r->cl = rvc_normal; 3011 1.1 mrg r->sign = sign; 3012 1.1 mrg SET_REAL_EXP (r, -126); 3013 1.1 mrg r->sig[SIGSZ-1] = image << 1; 3014 1.1 mrg normalize (r); 3015 1.1 mrg } 3016 1.1 mrg else if (fmt->has_signed_zero) 3017 1.1 mrg r->sign = sign; 3018 1.1 mrg } 3019 1.1 mrg else if (exp == 255 && (fmt->has_nans || fmt->has_inf)) 3020 1.1 mrg { 3021 1.1 mrg if (image) 3022 1.1 mrg { 3023 1.1 mrg r->cl = rvc_nan; 3024 1.1 mrg r->sign = sign; 3025 1.1 mrg r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1) 3026 1.1 mrg ^ fmt->qnan_msb_set); 3027 1.1 mrg r->sig[SIGSZ-1] = image; 3028 1.1 mrg } 3029 1.1 mrg else 3030 1.1 mrg { 3031 1.1 mrg r->cl = rvc_inf; 3032 1.1 mrg r->sign = sign; 3033 1.1 mrg } 3034 1.1 mrg } 3035 1.1 mrg else 3036 1.1 mrg { 3037 1.1 mrg r->cl = rvc_normal; 3038 1.1 mrg r->sign = sign; 3039 1.1 mrg SET_REAL_EXP (r, exp - 127 + 1); 3040 1.1 mrg r->sig[SIGSZ-1] = image | SIG_MSB; 3041 1.1 mrg } 3042 1.1 mrg } 3043 1.1 mrg 3044 1.1 mrg const struct real_format ieee_single_format = 3045 1.1 mrg { 3046 1.1 mrg encode_ieee_single, 3047 1.1 mrg decode_ieee_single, 3048 1.1 mrg 2, 3049 1.1 mrg 24, 3050 1.1 mrg 24, 3051 1.1 mrg -125, 3052 1.1 mrg 128, 3053 1.1 mrg 31, 3054 1.1 mrg 31, 3055 1.1 mrg 32, 3056 1.1 mrg false, 3057 1.1 mrg true, 3058 1.1 mrg true, 3059 1.1 mrg true, 3060 1.1 mrg true, 3061 1.1 mrg true, 3062 1.1 mrg true, 3063 1.1 mrg false, 3064 1.1 mrg "ieee_single" 3065 1.1 mrg }; 3066 1.1 mrg 3067 1.1 mrg const struct real_format mips_single_format = 3068 1.1 mrg { 3069 1.1 mrg encode_ieee_single, 3070 1.1 mrg decode_ieee_single, 3071 1.1 mrg 2, 3072 1.1 mrg 24, 3073 1.1 mrg 24, 3074 1.1 mrg -125, 3075 1.1 mrg 128, 3076 1.1 mrg 31, 3077 1.1 mrg 31, 3078 1.1 mrg 32, 3079 1.1 mrg false, 3080 1.1 mrg true, 3081 1.1 mrg true, 3082 1.1 mrg true, 3083 1.1 mrg true, 3084 1.1 mrg true, 3085 1.1 mrg false, 3086 1.1 mrg true, 3087 1.1 mrg "mips_single" 3088 1.1 mrg }; 3089 1.1 mrg 3090 1.1 mrg const struct real_format motorola_single_format = 3091 1.1 mrg { 3092 1.1 mrg encode_ieee_single, 3093 1.1 mrg decode_ieee_single, 3094 1.1 mrg 2, 3095 1.1 mrg 24, 3096 1.1 mrg 24, 3097 1.1 mrg -125, 3098 1.1 mrg 128, 3099 1.1 mrg 31, 3100 1.1 mrg 31, 3101 1.1 mrg 32, 3102 1.1 mrg false, 3103 1.1 mrg true, 3104 1.1 mrg true, 3105 1.1 mrg true, 3106 1.1 mrg true, 3107 1.1 mrg true, 3108 1.1 mrg true, 3109 1.1 mrg true, 3110 1.1 mrg "motorola_single" 3111 1.1 mrg }; 3112 1.1 mrg 3113 1.1 mrg /* SPU Single Precision (Extended-Range Mode) format is the same as IEEE 3114 1.1 mrg single precision with the following differences: 3115 1.1 mrg - Infinities are not supported. Instead MAX_FLOAT or MIN_FLOAT 3116 1.1 mrg are generated. 3117 1.1 mrg - NaNs are not supported. 3118 1.1 mrg - The range of non-zero numbers in binary is 3119 1.1 mrg (001)[1.]000...000 to (255)[1.]111...111. 3120 1.1 mrg - Denormals can be represented, but are treated as +0.0 when 3121 1.1 mrg used as an operand and are never generated as a result. 3122 1.1 mrg - -0.0 can be represented, but a zero result is always +0.0. 3123 1.1 mrg - the only supported rounding mode is trunction (towards zero). */ 3124 1.1 mrg const struct real_format spu_single_format = 3125 1.1 mrg { 3126 1.1 mrg encode_ieee_single, 3127 1.1 mrg decode_ieee_single, 3128 1.1 mrg 2, 3129 1.1 mrg 24, 3130 1.1 mrg 24, 3131 1.1 mrg -125, 3132 1.1 mrg 129, 3133 1.1 mrg 31, 3134 1.1 mrg 31, 3135 1.1 mrg 0, 3136 1.1 mrg true, 3137 1.1 mrg false, 3138 1.1 mrg false, 3139 1.1 mrg false, 3140 1.1 mrg true, 3141 1.1 mrg true, 3142 1.1 mrg false, 3143 1.1 mrg false, 3144 1.1 mrg "spu_single" 3145 1.1 mrg }; 3146 1.1 mrg 3147 1.1 mrg /* IEEE double-precision format. */ 3149 1.1 mrg 3150 1.1 mrg static void encode_ieee_double (const struct real_format *fmt, 3151 1.1 mrg long *, const REAL_VALUE_TYPE *); 3152 1.1 mrg static void decode_ieee_double (const struct real_format *, 3153 1.1 mrg REAL_VALUE_TYPE *, const long *); 3154 1.1 mrg 3155 1.1 mrg static void 3156 1.1 mrg encode_ieee_double (const struct real_format *fmt, long *buf, 3157 1.1 mrg const REAL_VALUE_TYPE *r) 3158 1.1 mrg { 3159 1.1 mrg unsigned long image_lo, image_hi, sig_lo, sig_hi, exp; 3160 1.1 mrg unsigned long sign = r->sign; 3161 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0; 3162 1.1 mrg 3163 1.1 mrg image_hi = sign << 31; 3164 1.1 mrg image_lo = 0; 3165 1.1 mrg 3166 1.1 mrg if (HOST_BITS_PER_LONG == 64) 3167 1.1 mrg { 3168 1.1 mrg sig_hi = r->sig[SIGSZ-1]; 3169 1.1 mrg sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff; 3170 1.1 mrg sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff; 3171 1.1 mrg } 3172 1.1 mrg else 3173 1.1 mrg { 3174 1.1 mrg sig_hi = r->sig[SIGSZ-1]; 3175 1.1 mrg sig_lo = r->sig[SIGSZ-2]; 3176 1.1 mrg sig_lo = (sig_hi << 21) | (sig_lo >> 11); 3177 1.1 mrg sig_hi = (sig_hi >> 11) & 0xfffff; 3178 1.1 mrg } 3179 1.1 mrg 3180 1.1 mrg switch (r->cl) 3181 1.1 mrg { 3182 1.1 mrg case rvc_zero: 3183 1.1 mrg break; 3184 1.1 mrg 3185 1.1 mrg case rvc_inf: 3186 1.1 mrg if (fmt->has_inf) 3187 1.1 mrg image_hi |= 2047 << 20; 3188 1.1 mrg else 3189 1.1 mrg { 3190 1.1 mrg image_hi |= 0x7fffffff; 3191 1.1 mrg image_lo = 0xffffffff; 3192 1.1 mrg } 3193 1.1 mrg break; 3194 1.1 mrg 3195 1.1 mrg case rvc_nan: 3196 1.1 mrg if (fmt->has_nans) 3197 1.1 mrg { 3198 1.1 mrg if (r->canonical) 3199 1.1 mrg { 3200 1.1 mrg if (fmt->canonical_nan_lsbs_set) 3201 1.1 mrg { 3202 1.1 mrg sig_hi = (1 << 19) - 1; 3203 1.1 mrg sig_lo = 0xffffffff; 3204 1.1 mrg } 3205 1.1 mrg else 3206 1.1 mrg { 3207 1.1 mrg sig_hi = 0; 3208 1.1 mrg sig_lo = 0; 3209 1.1 mrg } 3210 1.1 mrg } 3211 1.1 mrg if (r->signalling == fmt->qnan_msb_set) 3212 1.1 mrg sig_hi &= ~(1 << 19); 3213 1.1 mrg else 3214 1.1 mrg sig_hi |= 1 << 19; 3215 1.1 mrg if (sig_hi == 0 && sig_lo == 0) 3216 1.1 mrg sig_hi = 1 << 18; 3217 1.1 mrg 3218 1.1 mrg image_hi |= 2047 << 20; 3219 1.1 mrg image_hi |= sig_hi; 3220 1.1 mrg image_lo = sig_lo; 3221 1.1 mrg } 3222 1.1 mrg else 3223 1.1 mrg { 3224 1.1 mrg image_hi |= 0x7fffffff; 3225 1.1 mrg image_lo = 0xffffffff; 3226 1.1 mrg } 3227 1.1 mrg break; 3228 1.1 mrg 3229 1.1 mrg case rvc_normal: 3230 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp, 3231 1.1 mrg whereas the intermediate representation is 0.F x 2**exp. 3232 1.1 mrg Which means we're off by one. */ 3233 1.1 mrg if (denormal) 3234 1.1 mrg exp = 0; 3235 1.1 mrg else 3236 1.1 mrg exp = REAL_EXP (r) + 1023 - 1; 3237 1.1 mrg image_hi |= exp << 20; 3238 1.1 mrg image_hi |= sig_hi; 3239 1.1 mrg image_lo = sig_lo; 3240 1.1 mrg break; 3241 1.1 mrg 3242 1.1 mrg default: 3243 1.1 mrg gcc_unreachable (); 3244 1.1 mrg } 3245 1.1 mrg 3246 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 3247 1.1 mrg buf[0] = image_hi, buf[1] = image_lo; 3248 1.1 mrg else 3249 1.1 mrg buf[0] = image_lo, buf[1] = image_hi; 3250 1.1 mrg } 3251 1.1 mrg 3252 1.1 mrg static void 3253 1.1 mrg decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r, 3254 1.1 mrg const long *buf) 3255 1.1 mrg { 3256 1.1 mrg unsigned long image_hi, image_lo; 3257 1.1 mrg bool sign; 3258 1.1 mrg int exp; 3259 1.1 mrg 3260 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 3261 1.1 mrg image_hi = buf[0], image_lo = buf[1]; 3262 1.1 mrg else 3263 1.1 mrg image_lo = buf[0], image_hi = buf[1]; 3264 1.1 mrg image_lo &= 0xffffffff; 3265 1.1 mrg image_hi &= 0xffffffff; 3266 1.1 mrg 3267 1.1 mrg sign = (image_hi >> 31) & 1; 3268 1.1 mrg exp = (image_hi >> 20) & 0x7ff; 3269 1.1 mrg 3270 1.1 mrg memset (r, 0, sizeof (*r)); 3271 1.1 mrg 3272 1.1 mrg image_hi <<= 32 - 21; 3273 1.1 mrg image_hi |= image_lo >> 21; 3274 1.1 mrg image_hi &= 0x7fffffff; 3275 1.1 mrg image_lo <<= 32 - 21; 3276 1.1 mrg 3277 1.1 mrg if (exp == 0) 3278 1.1 mrg { 3279 1.1 mrg if ((image_hi || image_lo) && fmt->has_denorm) 3280 1.1 mrg { 3281 1.1 mrg r->cl = rvc_normal; 3282 1.1 mrg r->sign = sign; 3283 1.1 mrg SET_REAL_EXP (r, -1022); 3284 1.1 mrg if (HOST_BITS_PER_LONG == 32) 3285 1.1 mrg { 3286 1.1 mrg image_hi = (image_hi << 1) | (image_lo >> 31); 3287 1.1 mrg image_lo <<= 1; 3288 1.1 mrg r->sig[SIGSZ-1] = image_hi; 3289 1.1 mrg r->sig[SIGSZ-2] = image_lo; 3290 1.1 mrg } 3291 1.1 mrg else 3292 1.1 mrg { 3293 1.1 mrg image_hi = (image_hi << 31 << 2) | (image_lo << 1); 3294 1.1 mrg r->sig[SIGSZ-1] = image_hi; 3295 1.1 mrg } 3296 1.1 mrg normalize (r); 3297 1.1 mrg } 3298 1.1 mrg else if (fmt->has_signed_zero) 3299 1.1 mrg r->sign = sign; 3300 1.1 mrg } 3301 1.1 mrg else if (exp == 2047 && (fmt->has_nans || fmt->has_inf)) 3302 1.1 mrg { 3303 1.1 mrg if (image_hi || image_lo) 3304 1.1 mrg { 3305 1.1 mrg r->cl = rvc_nan; 3306 1.1 mrg r->sign = sign; 3307 1.1 mrg r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set; 3308 1.1 mrg if (HOST_BITS_PER_LONG == 32) 3309 1.1 mrg { 3310 1.1 mrg r->sig[SIGSZ-1] = image_hi; 3311 1.1 mrg r->sig[SIGSZ-2] = image_lo; 3312 1.1 mrg } 3313 1.1 mrg else 3314 1.1 mrg r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo; 3315 1.1 mrg } 3316 1.1 mrg else 3317 1.1 mrg { 3318 1.1 mrg r->cl = rvc_inf; 3319 1.1 mrg r->sign = sign; 3320 1.1 mrg } 3321 1.1 mrg } 3322 1.1 mrg else 3323 1.1 mrg { 3324 1.1 mrg r->cl = rvc_normal; 3325 1.1 mrg r->sign = sign; 3326 1.1 mrg SET_REAL_EXP (r, exp - 1023 + 1); 3327 1.1 mrg if (HOST_BITS_PER_LONG == 32) 3328 1.1 mrg { 3329 1.1 mrg r->sig[SIGSZ-1] = image_hi | SIG_MSB; 3330 1.1 mrg r->sig[SIGSZ-2] = image_lo; 3331 1.1 mrg } 3332 1.1 mrg else 3333 1.1 mrg r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB; 3334 1.1 mrg } 3335 1.1 mrg } 3336 1.1 mrg 3337 1.1 mrg const struct real_format ieee_double_format = 3338 1.1 mrg { 3339 1.1 mrg encode_ieee_double, 3340 1.1 mrg decode_ieee_double, 3341 1.1 mrg 2, 3342 1.1 mrg 53, 3343 1.1 mrg 53, 3344 1.1 mrg -1021, 3345 1.1 mrg 1024, 3346 1.1 mrg 63, 3347 1.1 mrg 63, 3348 1.1 mrg 64, 3349 1.1 mrg false, 3350 1.1 mrg true, 3351 1.1 mrg true, 3352 1.1 mrg true, 3353 1.1 mrg true, 3354 1.1 mrg true, 3355 1.1 mrg true, 3356 1.1 mrg false, 3357 1.1 mrg "ieee_double" 3358 1.1 mrg }; 3359 1.1 mrg 3360 1.1 mrg const struct real_format mips_double_format = 3361 1.1 mrg { 3362 1.1 mrg encode_ieee_double, 3363 1.1 mrg decode_ieee_double, 3364 1.1 mrg 2, 3365 1.1 mrg 53, 3366 1.1 mrg 53, 3367 1.1 mrg -1021, 3368 1.1 mrg 1024, 3369 1.1 mrg 63, 3370 1.1 mrg 63, 3371 1.1 mrg 64, 3372 1.1 mrg false, 3373 1.1 mrg true, 3374 1.1 mrg true, 3375 1.1 mrg true, 3376 1.1 mrg true, 3377 1.1 mrg true, 3378 1.1 mrg false, 3379 1.1 mrg true, 3380 1.1 mrg "mips_double" 3381 1.1 mrg }; 3382 1.1 mrg 3383 1.1 mrg const struct real_format motorola_double_format = 3384 1.1 mrg { 3385 1.1 mrg encode_ieee_double, 3386 1.1 mrg decode_ieee_double, 3387 1.1 mrg 2, 3388 1.1 mrg 53, 3389 1.1 mrg 53, 3390 1.1 mrg -1021, 3391 1.1 mrg 1024, 3392 1.1 mrg 63, 3393 1.1 mrg 63, 3394 1.1 mrg 64, 3395 1.1 mrg false, 3396 1.1 mrg true, 3397 1.1 mrg true, 3398 1.1 mrg true, 3399 1.1 mrg true, 3400 1.1 mrg true, 3401 1.1 mrg true, 3402 1.1 mrg true, 3403 1.1 mrg "motorola_double" 3404 1.1 mrg }; 3405 1.1 mrg 3406 1.1 mrg /* IEEE extended real format. This comes in three flavors: Intel's as 3408 1.1 mrg a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel 3409 1.1 mrg 12- and 16-byte images may be big- or little endian; Motorola's is 3410 1.1 mrg always big endian. */ 3411 1.1 mrg 3412 1.1 mrg /* Helper subroutine which converts from the internal format to the 3413 1.1 mrg 12-byte little-endian Intel format. Functions below adjust this 3414 1.1 mrg for the other possible formats. */ 3415 1.1 mrg static void 3416 1.1 mrg encode_ieee_extended (const struct real_format *fmt, long *buf, 3417 1.1 mrg const REAL_VALUE_TYPE *r) 3418 1.1 mrg { 3419 1.1 mrg unsigned long image_hi, sig_hi, sig_lo; 3420 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0; 3421 1.1 mrg 3422 1.1 mrg image_hi = r->sign << 15; 3423 1.1 mrg sig_hi = sig_lo = 0; 3424 1.1 mrg 3425 1.1 mrg switch (r->cl) 3426 1.1 mrg { 3427 1.1 mrg case rvc_zero: 3428 1.1 mrg break; 3429 1.1 mrg 3430 1.1 mrg case rvc_inf: 3431 1.1 mrg if (fmt->has_inf) 3432 1.1 mrg { 3433 1.1 mrg image_hi |= 32767; 3434 1.1 mrg 3435 1.1 mrg /* Intel requires the explicit integer bit to be set, otherwise 3436 1.1 mrg it considers the value a "pseudo-infinity". Motorola docs 3437 1.1 mrg say it doesn't care. */ 3438 1.1 mrg sig_hi = 0x80000000; 3439 1.1 mrg } 3440 1.1 mrg else 3441 1.1 mrg { 3442 1.1 mrg image_hi |= 32767; 3443 1.1 mrg sig_lo = sig_hi = 0xffffffff; 3444 1.1 mrg } 3445 1.1 mrg break; 3446 1.1 mrg 3447 1.1 mrg case rvc_nan: 3448 1.1 mrg if (fmt->has_nans) 3449 1.1 mrg { 3450 1.1 mrg image_hi |= 32767; 3451 1.1 mrg if (r->canonical) 3452 1.1 mrg { 3453 1.1 mrg if (fmt->canonical_nan_lsbs_set) 3454 1.1 mrg { 3455 1.1 mrg sig_hi = (1 << 30) - 1; 3456 1.1 mrg sig_lo = 0xffffffff; 3457 1.1 mrg } 3458 1.1 mrg } 3459 1.1 mrg else if (HOST_BITS_PER_LONG == 32) 3460 1.1 mrg { 3461 1.1 mrg sig_hi = r->sig[SIGSZ-1]; 3462 1.1 mrg sig_lo = r->sig[SIGSZ-2]; 3463 1.1 mrg } 3464 1.1 mrg else 3465 1.1 mrg { 3466 1.1 mrg sig_lo = r->sig[SIGSZ-1]; 3467 1.1 mrg sig_hi = sig_lo >> 31 >> 1; 3468 1.1 mrg sig_lo &= 0xffffffff; 3469 1.1 mrg } 3470 1.1 mrg if (r->signalling == fmt->qnan_msb_set) 3471 1.1 mrg sig_hi &= ~(1 << 30); 3472 1.1 mrg else 3473 1.1 mrg sig_hi |= 1 << 30; 3474 1.1 mrg if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0) 3475 1.1 mrg sig_hi = 1 << 29; 3476 1.1 mrg 3477 1.1 mrg /* Intel requires the explicit integer bit to be set, otherwise 3478 1.1 mrg it considers the value a "pseudo-nan". Motorola docs say it 3479 1.1 mrg doesn't care. */ 3480 1.1 mrg sig_hi |= 0x80000000; 3481 1.1 mrg } 3482 1.1 mrg else 3483 1.1 mrg { 3484 1.1 mrg image_hi |= 32767; 3485 1.1 mrg sig_lo = sig_hi = 0xffffffff; 3486 1.1 mrg } 3487 1.1 mrg break; 3488 1.1 mrg 3489 1.1 mrg case rvc_normal: 3490 1.1 mrg { 3491 1.1 mrg int exp = REAL_EXP (r); 3492 1.1 mrg 3493 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp, 3494 1.1 mrg whereas the intermediate representation is 0.F x 2**exp. 3495 1.1 mrg Which means we're off by one. 3496 1.1 mrg 3497 1.1 mrg Except for Motorola, which consider exp=0 and explicit 3498 1.1 mrg integer bit set to continue to be normalized. In theory 3499 1.1 mrg this discrepancy has been taken care of by the difference 3500 1.1 mrg in fmt->emin in round_for_format. */ 3501 1.1 mrg 3502 1.1 mrg if (denormal) 3503 1.1 mrg exp = 0; 3504 1.1 mrg else 3505 1.1 mrg { 3506 1.1 mrg exp += 16383 - 1; 3507 1.1 mrg gcc_assert (exp >= 0); 3508 1.1 mrg } 3509 1.1 mrg image_hi |= exp; 3510 1.1 mrg 3511 1.1 mrg if (HOST_BITS_PER_LONG == 32) 3512 1.1 mrg { 3513 1.1 mrg sig_hi = r->sig[SIGSZ-1]; 3514 1.1 mrg sig_lo = r->sig[SIGSZ-2]; 3515 1.1 mrg } 3516 1.1 mrg else 3517 1.1 mrg { 3518 1.1 mrg sig_lo = r->sig[SIGSZ-1]; 3519 1.1 mrg sig_hi = sig_lo >> 31 >> 1; 3520 1.1 mrg sig_lo &= 0xffffffff; 3521 1.1 mrg } 3522 1.1 mrg } 3523 1.1 mrg break; 3524 1.1 mrg 3525 1.1 mrg default: 3526 1.1 mrg gcc_unreachable (); 3527 1.1 mrg } 3528 1.1 mrg 3529 1.1 mrg buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi; 3530 1.1 mrg } 3531 1.1 mrg 3532 1.1 mrg /* Convert from the internal format to the 12-byte Motorola format 3533 1.1 mrg for an IEEE extended real. */ 3534 1.1 mrg static void 3535 1.1 mrg encode_ieee_extended_motorola (const struct real_format *fmt, long *buf, 3536 1.1 mrg const REAL_VALUE_TYPE *r) 3537 1.1 mrg { 3538 1.1 mrg long intermed[3]; 3539 1.1 mrg encode_ieee_extended (fmt, intermed, r); 3540 1.1 mrg 3541 1.1 mrg if (r->cl == rvc_inf) 3542 1.1 mrg /* For infinity clear the explicit integer bit again, so that the 3543 1.1 mrg format matches the canonical infinity generated by the FPU. */ 3544 1.1 mrg intermed[1] = 0; 3545 1.1 mrg 3546 1.1 mrg /* Motorola chips are assumed always to be big-endian. Also, the 3547 1.1 mrg padding in a Motorola extended real goes between the exponent and 3548 1.1 mrg the mantissa. At this point the mantissa is entirely within 3549 1.1 mrg elements 0 and 1 of intermed, and the exponent entirely within 3550 1.1 mrg element 2, so all we have to do is swap the order around, and 3551 1.1 mrg shift element 2 left 16 bits. */ 3552 1.1 mrg buf[0] = intermed[2] << 16; 3553 1.1 mrg buf[1] = intermed[1]; 3554 1.1 mrg buf[2] = intermed[0]; 3555 1.1 mrg } 3556 1.1 mrg 3557 1.1 mrg /* Convert from the internal format to the 12-byte Intel format for 3558 1.1 mrg an IEEE extended real. */ 3559 1.1 mrg static void 3560 1.1 mrg encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf, 3561 1.1 mrg const REAL_VALUE_TYPE *r) 3562 1.1 mrg { 3563 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 3564 1.1 mrg { 3565 1.1 mrg /* All the padding in an Intel-format extended real goes at the high 3566 1.1 mrg end, which in this case is after the mantissa, not the exponent. 3567 1.1 mrg Therefore we must shift everything down 16 bits. */ 3568 1.1 mrg long intermed[3]; 3569 1.1 mrg encode_ieee_extended (fmt, intermed, r); 3570 1.1 mrg buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16)); 3571 1.1 mrg buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16)); 3572 1.1 mrg buf[2] = (intermed[0] << 16); 3573 1.1 mrg } 3574 1.1 mrg else 3575 1.1 mrg /* encode_ieee_extended produces what we want directly. */ 3576 1.1 mrg encode_ieee_extended (fmt, buf, r); 3577 1.1 mrg } 3578 1.1 mrg 3579 1.1 mrg /* Convert from the internal format to the 16-byte Intel format for 3580 1.1 mrg an IEEE extended real. */ 3581 1.1 mrg static void 3582 1.1 mrg encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf, 3583 1.1 mrg const REAL_VALUE_TYPE *r) 3584 1.1 mrg { 3585 1.1 mrg /* All the padding in an Intel-format extended real goes at the high end. */ 3586 1.1 mrg encode_ieee_extended_intel_96 (fmt, buf, r); 3587 1.1 mrg buf[3] = 0; 3588 1.1 mrg } 3589 1.1 mrg 3590 1.1 mrg /* As above, we have a helper function which converts from 12-byte 3591 1.1 mrg little-endian Intel format to internal format. Functions below 3592 1.1 mrg adjust for the other possible formats. */ 3593 1.1 mrg static void 3594 1.1 mrg decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r, 3595 1.1 mrg const long *buf) 3596 1.1 mrg { 3597 1.1 mrg unsigned long image_hi, sig_hi, sig_lo; 3598 1.1 mrg bool sign; 3599 1.1 mrg int exp; 3600 1.1 mrg 3601 1.1 mrg sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2]; 3602 1.1 mrg sig_lo &= 0xffffffff; 3603 1.1 mrg sig_hi &= 0xffffffff; 3604 1.1 mrg image_hi &= 0xffffffff; 3605 1.1 mrg 3606 1.1 mrg sign = (image_hi >> 15) & 1; 3607 1.1 mrg exp = image_hi & 0x7fff; 3608 1.1 mrg 3609 1.1 mrg memset (r, 0, sizeof (*r)); 3610 1.1 mrg 3611 1.1 mrg if (exp == 0) 3612 1.1 mrg { 3613 1.1 mrg if ((sig_hi || sig_lo) && fmt->has_denorm) 3614 1.1 mrg { 3615 1.1 mrg r->cl = rvc_normal; 3616 1.1 mrg r->sign = sign; 3617 1.1 mrg 3618 1.1 mrg /* When the IEEE format contains a hidden bit, we know that 3619 1.1 mrg it's zero at this point, and so shift up the significand 3620 1.1 mrg and decrease the exponent to match. In this case, Motorola 3621 1.1 mrg defines the explicit integer bit to be valid, so we don't 3622 1.1 mrg know whether the msb is set or not. */ 3623 1.1 mrg SET_REAL_EXP (r, fmt->emin); 3624 1.1 mrg if (HOST_BITS_PER_LONG == 32) 3625 1.1 mrg { 3626 1.1 mrg r->sig[SIGSZ-1] = sig_hi; 3627 1.1 mrg r->sig[SIGSZ-2] = sig_lo; 3628 1.1 mrg } 3629 1.1 mrg else 3630 1.1 mrg r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo; 3631 1.1 mrg 3632 1.1 mrg normalize (r); 3633 1.1 mrg } 3634 1.1 mrg else if (fmt->has_signed_zero) 3635 1.1 mrg r->sign = sign; 3636 1.1 mrg } 3637 1.1 mrg else if (exp == 32767 && (fmt->has_nans || fmt->has_inf)) 3638 1.1 mrg { 3639 1.1 mrg /* See above re "pseudo-infinities" and "pseudo-nans". 3640 1.1 mrg Short summary is that the MSB will likely always be 3641 1.1 mrg set, and that we don't care about it. */ 3642 1.1 mrg sig_hi &= 0x7fffffff; 3643 1.1 mrg 3644 1.1 mrg if (sig_hi || sig_lo) 3645 1.1 mrg { 3646 1.1 mrg r->cl = rvc_nan; 3647 1.1 mrg r->sign = sign; 3648 1.1 mrg r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set; 3649 1.1 mrg if (HOST_BITS_PER_LONG == 32) 3650 1.1 mrg { 3651 1.1 mrg r->sig[SIGSZ-1] = sig_hi; 3652 1.1 mrg r->sig[SIGSZ-2] = sig_lo; 3653 1.1 mrg } 3654 1.1 mrg else 3655 1.1 mrg r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo; 3656 1.1 mrg } 3657 1.1 mrg else 3658 1.1 mrg { 3659 1.1 mrg r->cl = rvc_inf; 3660 1.1 mrg r->sign = sign; 3661 1.1 mrg } 3662 1.1 mrg } 3663 1.1 mrg else 3664 1.1 mrg { 3665 1.1 mrg r->cl = rvc_normal; 3666 1.1 mrg r->sign = sign; 3667 1.1 mrg SET_REAL_EXP (r, exp - 16383 + 1); 3668 1.1 mrg if (HOST_BITS_PER_LONG == 32) 3669 1.1 mrg { 3670 1.1 mrg r->sig[SIGSZ-1] = sig_hi; 3671 1.1 mrg r->sig[SIGSZ-2] = sig_lo; 3672 1.1 mrg } 3673 1.1 mrg else 3674 1.1 mrg r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo; 3675 1.1 mrg } 3676 1.1 mrg } 3677 1.1 mrg 3678 1.1 mrg /* Convert from the internal format to the 12-byte Motorola format 3679 1.1 mrg for an IEEE extended real. */ 3680 1.1 mrg static void 3681 1.1 mrg decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r, 3682 1.1 mrg const long *buf) 3683 1.1 mrg { 3684 1.1 mrg long intermed[3]; 3685 1.1 mrg 3686 1.1 mrg /* Motorola chips are assumed always to be big-endian. Also, the 3687 1.1 mrg padding in a Motorola extended real goes between the exponent and 3688 1.1 mrg the mantissa; remove it. */ 3689 1.1 mrg intermed[0] = buf[2]; 3690 1.1 mrg intermed[1] = buf[1]; 3691 1.1 mrg intermed[2] = (unsigned long)buf[0] >> 16; 3692 1.1 mrg 3693 1.1 mrg decode_ieee_extended (fmt, r, intermed); 3694 1.1 mrg } 3695 1.1 mrg 3696 1.1 mrg /* Convert from the internal format to the 12-byte Intel format for 3697 1.1 mrg an IEEE extended real. */ 3698 1.1 mrg static void 3699 1.1 mrg decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r, 3700 1.1 mrg const long *buf) 3701 1.1 mrg { 3702 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 3703 1.1 mrg { 3704 1.1 mrg /* All the padding in an Intel-format extended real goes at the high 3705 1.1 mrg end, which in this case is after the mantissa, not the exponent. 3706 1.1 mrg Therefore we must shift everything up 16 bits. */ 3707 1.1 mrg long intermed[3]; 3708 1.1 mrg 3709 1.1 mrg intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16)); 3710 1.1 mrg intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16)); 3711 1.1 mrg intermed[2] = ((unsigned long)buf[0] >> 16); 3712 1.1 mrg 3713 1.1 mrg decode_ieee_extended (fmt, r, intermed); 3714 1.1 mrg } 3715 1.1 mrg else 3716 1.1 mrg /* decode_ieee_extended produces what we want directly. */ 3717 1.1 mrg decode_ieee_extended (fmt, r, buf); 3718 1.1 mrg } 3719 1.1 mrg 3720 1.1 mrg /* Convert from the internal format to the 16-byte Intel format for 3721 1.1 mrg an IEEE extended real. */ 3722 1.1 mrg static void 3723 1.1 mrg decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r, 3724 1.1 mrg const long *buf) 3725 1.1 mrg { 3726 1.1 mrg /* All the padding in an Intel-format extended real goes at the high end. */ 3727 1.1 mrg decode_ieee_extended_intel_96 (fmt, r, buf); 3728 1.1 mrg } 3729 1.1 mrg 3730 1.1 mrg const struct real_format ieee_extended_motorola_format = 3731 1.1 mrg { 3732 1.1 mrg encode_ieee_extended_motorola, 3733 1.1 mrg decode_ieee_extended_motorola, 3734 1.1 mrg 2, 3735 1.1 mrg 64, 3736 1.1 mrg 64, 3737 1.1 mrg -16382, 3738 1.1 mrg 16384, 3739 1.1 mrg 95, 3740 1.1 mrg 95, 3741 1.1 mrg 0, 3742 1.1 mrg false, 3743 1.1 mrg true, 3744 1.1 mrg true, 3745 1.1 mrg true, 3746 1.1 mrg true, 3747 1.1 mrg true, 3748 1.1 mrg true, 3749 1.1 mrg true, 3750 1.1 mrg "ieee_extended_motorola" 3751 1.1 mrg }; 3752 1.1 mrg 3753 1.1 mrg const struct real_format ieee_extended_intel_96_format = 3754 1.1 mrg { 3755 1.1 mrg encode_ieee_extended_intel_96, 3756 1.1 mrg decode_ieee_extended_intel_96, 3757 1.1 mrg 2, 3758 1.1 mrg 64, 3759 1.1 mrg 64, 3760 1.1 mrg -16381, 3761 1.1 mrg 16384, 3762 1.1 mrg 79, 3763 1.1 mrg 79, 3764 1.1 mrg 65, 3765 1.1 mrg false, 3766 1.1 mrg true, 3767 1.1 mrg true, 3768 1.1 mrg true, 3769 1.1 mrg true, 3770 1.1 mrg true, 3771 1.1 mrg true, 3772 1.1 mrg false, 3773 1.1 mrg "ieee_extended_intel_96" 3774 1.1 mrg }; 3775 1.1 mrg 3776 1.1 mrg const struct real_format ieee_extended_intel_128_format = 3777 1.1 mrg { 3778 1.1 mrg encode_ieee_extended_intel_128, 3779 1.1 mrg decode_ieee_extended_intel_128, 3780 1.1 mrg 2, 3781 1.1 mrg 64, 3782 1.1 mrg 64, 3783 1.1 mrg -16381, 3784 1.1 mrg 16384, 3785 1.1 mrg 79, 3786 1.1 mrg 79, 3787 1.1 mrg 65, 3788 1.1 mrg false, 3789 1.1 mrg true, 3790 1.1 mrg true, 3791 1.1 mrg true, 3792 1.1 mrg true, 3793 1.1 mrg true, 3794 1.1 mrg true, 3795 1.1 mrg false, 3796 1.1 mrg "ieee_extended_intel_128" 3797 1.1 mrg }; 3798 1.1 mrg 3799 1.1 mrg /* The following caters to i386 systems that set the rounding precision 3800 1.1 mrg to 53 bits instead of 64, e.g. FreeBSD. */ 3801 1.1 mrg const struct real_format ieee_extended_intel_96_round_53_format = 3802 1.1 mrg { 3803 1.1 mrg encode_ieee_extended_intel_96, 3804 1.1 mrg decode_ieee_extended_intel_96, 3805 1.1 mrg 2, 3806 1.1 mrg 53, 3807 1.1 mrg 53, 3808 1.1 mrg -16381, 3809 1.1 mrg 16384, 3810 1.1 mrg 79, 3811 1.1 mrg 79, 3812 1.1 mrg 33, 3813 1.1 mrg false, 3814 1.1 mrg true, 3815 1.1 mrg true, 3816 1.1 mrg true, 3817 1.1 mrg true, 3818 1.1 mrg true, 3819 1.1 mrg true, 3820 1.1 mrg false, 3821 1.1 mrg "ieee_extended_intel_96_round_53" 3822 1.1 mrg }; 3823 1.1 mrg 3824 1.1 mrg /* IBM 128-bit extended precision format: a pair of IEEE double precision 3826 1.1 mrg numbers whose sum is equal to the extended precision value. The number 3827 1.1 mrg with greater magnitude is first. This format has the same magnitude 3828 1.1 mrg range as an IEEE double precision value, but effectively 106 bits of 3829 1.1 mrg significand precision. Infinity and NaN are represented by their IEEE 3830 1.1 mrg double precision value stored in the first number, the second number is 3831 1.1 mrg +0.0 or -0.0 for Infinity and don't-care for NaN. */ 3832 1.1 mrg 3833 1.1 mrg static void encode_ibm_extended (const struct real_format *fmt, 3834 1.1 mrg long *, const REAL_VALUE_TYPE *); 3835 1.1 mrg static void decode_ibm_extended (const struct real_format *, 3836 1.1 mrg REAL_VALUE_TYPE *, const long *); 3837 1.1 mrg 3838 1.1 mrg static void 3839 1.1 mrg encode_ibm_extended (const struct real_format *fmt, long *buf, 3840 1.1 mrg const REAL_VALUE_TYPE *r) 3841 1.1 mrg { 3842 1.1 mrg REAL_VALUE_TYPE u, normr, v; 3843 1.1 mrg const struct real_format *base_fmt; 3844 1.1 mrg 3845 1.1 mrg base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format; 3846 1.1 mrg 3847 1.1 mrg /* Renormalize R before doing any arithmetic on it. */ 3848 1.1 mrg normr = *r; 3849 1.1 mrg if (normr.cl == rvc_normal) 3850 1.1 mrg normalize (&normr); 3851 1.1 mrg 3852 1.1 mrg /* u = IEEE double precision portion of significand. */ 3853 1.1 mrg u = normr; 3854 1.1 mrg round_for_format (base_fmt, &u); 3855 1.1 mrg encode_ieee_double (base_fmt, &buf[0], &u); 3856 1.1 mrg 3857 1.1 mrg if (u.cl == rvc_normal) 3858 1.1 mrg { 3859 1.1 mrg do_add (&v, &normr, &u, 1); 3860 1.1 mrg /* Call round_for_format since we might need to denormalize. */ 3861 1.1 mrg round_for_format (base_fmt, &v); 3862 1.1 mrg encode_ieee_double (base_fmt, &buf[2], &v); 3863 1.1 mrg } 3864 1.1 mrg else 3865 1.1 mrg { 3866 1.1 mrg /* Inf, NaN, 0 are all representable as doubles, so the 3867 1.1 mrg least-significant part can be 0.0. */ 3868 1.1 mrg buf[2] = 0; 3869 1.1 mrg buf[3] = 0; 3870 1.1 mrg } 3871 1.1 mrg } 3872 1.1 mrg 3873 1.1 mrg static void 3874 1.1 mrg decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r, 3875 1.1 mrg const long *buf) 3876 1.1 mrg { 3877 1.1 mrg REAL_VALUE_TYPE u, v; 3878 1.1 mrg const struct real_format *base_fmt; 3879 1.1 mrg 3880 1.1 mrg base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format; 3881 1.1 mrg decode_ieee_double (base_fmt, &u, &buf[0]); 3882 1.1 mrg 3883 1.1 mrg if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan) 3884 1.1 mrg { 3885 1.1 mrg decode_ieee_double (base_fmt, &v, &buf[2]); 3886 1.1 mrg do_add (r, &u, &v, 0); 3887 1.1 mrg } 3888 1.1 mrg else 3889 1.1 mrg *r = u; 3890 1.1 mrg } 3891 1.1 mrg 3892 1.1 mrg const struct real_format ibm_extended_format = 3893 1.1 mrg { 3894 1.1 mrg encode_ibm_extended, 3895 1.1 mrg decode_ibm_extended, 3896 1.1 mrg 2, 3897 1.1 mrg 53 + 53, 3898 1.1 mrg 53, 3899 1.1 mrg -1021 + 53, 3900 1.1 mrg 1024, 3901 1.1 mrg 127, 3902 1.1 mrg -1, 3903 1.1 mrg 0, 3904 1.1 mrg false, 3905 1.1 mrg true, 3906 1.1 mrg true, 3907 1.1 mrg true, 3908 1.1 mrg true, 3909 1.1 mrg true, 3910 1.1 mrg true, 3911 1.1 mrg false, 3912 1.1 mrg "ibm_extended" 3913 1.1 mrg }; 3914 1.1 mrg 3915 1.1 mrg const struct real_format mips_extended_format = 3916 1.1 mrg { 3917 1.1 mrg encode_ibm_extended, 3918 1.1 mrg decode_ibm_extended, 3919 1.1 mrg 2, 3920 1.1 mrg 53 + 53, 3921 1.1 mrg 53, 3922 1.1 mrg -1021 + 53, 3923 1.1 mrg 1024, 3924 1.1 mrg 127, 3925 1.1 mrg -1, 3926 1.1 mrg 0, 3927 1.1 mrg false, 3928 1.1 mrg true, 3929 1.1 mrg true, 3930 1.1 mrg true, 3931 1.1 mrg true, 3932 1.1 mrg true, 3933 1.1 mrg false, 3934 1.1 mrg true, 3935 1.1 mrg "mips_extended" 3936 1.1 mrg }; 3937 1.1 mrg 3938 1.1 mrg 3939 1.1 mrg /* IEEE quad precision format. */ 3941 1.1 mrg 3942 1.1 mrg static void encode_ieee_quad (const struct real_format *fmt, 3943 1.1 mrg long *, const REAL_VALUE_TYPE *); 3944 1.1 mrg static void decode_ieee_quad (const struct real_format *, 3945 1.1 mrg REAL_VALUE_TYPE *, const long *); 3946 1.1 mrg 3947 1.1 mrg static void 3948 1.1 mrg encode_ieee_quad (const struct real_format *fmt, long *buf, 3949 1.1 mrg const REAL_VALUE_TYPE *r) 3950 1.1 mrg { 3951 1.1 mrg unsigned long image3, image2, image1, image0, exp; 3952 1.1 mrg unsigned long sign = r->sign; 3953 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0; 3954 1.1 mrg REAL_VALUE_TYPE u; 3955 1.1 mrg 3956 1.1 mrg image3 = sign << 31; 3957 1.1 mrg image2 = 0; 3958 1.1 mrg image1 = 0; 3959 1.1 mrg image0 = 0; 3960 1.1 mrg 3961 1.1 mrg rshift_significand (&u, r, SIGNIFICAND_BITS - 113); 3962 1.1 mrg 3963 1.1 mrg switch (r->cl) 3964 1.1 mrg { 3965 1.1 mrg case rvc_zero: 3966 1.1 mrg break; 3967 1.1 mrg 3968 1.1 mrg case rvc_inf: 3969 1.1 mrg if (fmt->has_inf) 3970 1.1 mrg image3 |= 32767 << 16; 3971 1.1 mrg else 3972 1.1 mrg { 3973 1.1 mrg image3 |= 0x7fffffff; 3974 1.1 mrg image2 = 0xffffffff; 3975 1.1 mrg image1 = 0xffffffff; 3976 1.1 mrg image0 = 0xffffffff; 3977 1.1 mrg } 3978 1.1 mrg break; 3979 1.1 mrg 3980 1.1 mrg case rvc_nan: 3981 1.1 mrg if (fmt->has_nans) 3982 1.1 mrg { 3983 1.1 mrg image3 |= 32767 << 16; 3984 1.1 mrg 3985 1.1 mrg if (r->canonical) 3986 1.1 mrg { 3987 1.1 mrg if (fmt->canonical_nan_lsbs_set) 3988 1.1 mrg { 3989 1.1 mrg image3 |= 0x7fff; 3990 1.1 mrg image2 = image1 = image0 = 0xffffffff; 3991 1.1 mrg } 3992 1.1 mrg } 3993 1.1 mrg else if (HOST_BITS_PER_LONG == 32) 3994 1.1 mrg { 3995 1.1 mrg image0 = u.sig[0]; 3996 1.1 mrg image1 = u.sig[1]; 3997 1.1 mrg image2 = u.sig[2]; 3998 1.1 mrg image3 |= u.sig[3] & 0xffff; 3999 1.1 mrg } 4000 1.1 mrg else 4001 1.1 mrg { 4002 1.1 mrg image0 = u.sig[0]; 4003 1.1 mrg image1 = image0 >> 31 >> 1; 4004 1.1 mrg image2 = u.sig[1]; 4005 1.1 mrg image3 |= (image2 >> 31 >> 1) & 0xffff; 4006 1.1 mrg image0 &= 0xffffffff; 4007 1.1 mrg image2 &= 0xffffffff; 4008 1.1 mrg } 4009 1.1 mrg if (r->signalling == fmt->qnan_msb_set) 4010 1.1 mrg image3 &= ~0x8000; 4011 1.1 mrg else 4012 1.1 mrg image3 |= 0x8000; 4013 1.1 mrg if (((image3 & 0xffff) | image2 | image1 | image0) == 0) 4014 1.1 mrg image3 |= 0x4000; 4015 1.1 mrg } 4016 1.1 mrg else 4017 1.1 mrg { 4018 1.1 mrg image3 |= 0x7fffffff; 4019 1.1 mrg image2 = 0xffffffff; 4020 1.1 mrg image1 = 0xffffffff; 4021 1.1 mrg image0 = 0xffffffff; 4022 1.1 mrg } 4023 1.1 mrg break; 4024 1.1 mrg 4025 1.1 mrg case rvc_normal: 4026 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp, 4027 1.1 mrg whereas the intermediate representation is 0.F x 2**exp. 4028 1.1 mrg Which means we're off by one. */ 4029 1.1 mrg if (denormal) 4030 1.1 mrg exp = 0; 4031 1.1 mrg else 4032 1.1 mrg exp = REAL_EXP (r) + 16383 - 1; 4033 1.1 mrg image3 |= exp << 16; 4034 1.1 mrg 4035 1.1 mrg if (HOST_BITS_PER_LONG == 32) 4036 1.1 mrg { 4037 1.1 mrg image0 = u.sig[0]; 4038 1.1 mrg image1 = u.sig[1]; 4039 1.1 mrg image2 = u.sig[2]; 4040 1.1 mrg image3 |= u.sig[3] & 0xffff; 4041 1.1 mrg } 4042 1.1 mrg else 4043 1.1 mrg { 4044 1.1 mrg image0 = u.sig[0]; 4045 1.1 mrg image1 = image0 >> 31 >> 1; 4046 1.1 mrg image2 = u.sig[1]; 4047 1.1 mrg image3 |= (image2 >> 31 >> 1) & 0xffff; 4048 1.1 mrg image0 &= 0xffffffff; 4049 1.1 mrg image2 &= 0xffffffff; 4050 1.1 mrg } 4051 1.1 mrg break; 4052 1.1 mrg 4053 1.1 mrg default: 4054 1.1 mrg gcc_unreachable (); 4055 1.1 mrg } 4056 1.1 mrg 4057 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 4058 1.1 mrg { 4059 1.1 mrg buf[0] = image3; 4060 1.1 mrg buf[1] = image2; 4061 1.1 mrg buf[2] = image1; 4062 1.1 mrg buf[3] = image0; 4063 1.1 mrg } 4064 1.1 mrg else 4065 1.1 mrg { 4066 1.1 mrg buf[0] = image0; 4067 1.1 mrg buf[1] = image1; 4068 1.1 mrg buf[2] = image2; 4069 1.1 mrg buf[3] = image3; 4070 1.1 mrg } 4071 1.1 mrg } 4072 1.1 mrg 4073 1.1 mrg static void 4074 1.1 mrg decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r, 4075 1.1 mrg const long *buf) 4076 1.1 mrg { 4077 1.1 mrg unsigned long image3, image2, image1, image0; 4078 1.1 mrg bool sign; 4079 1.1 mrg int exp; 4080 1.1 mrg 4081 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 4082 1.1 mrg { 4083 1.1 mrg image3 = buf[0]; 4084 1.1 mrg image2 = buf[1]; 4085 1.1 mrg image1 = buf[2]; 4086 1.1 mrg image0 = buf[3]; 4087 1.1 mrg } 4088 1.1 mrg else 4089 1.1 mrg { 4090 1.1 mrg image0 = buf[0]; 4091 1.1 mrg image1 = buf[1]; 4092 1.1 mrg image2 = buf[2]; 4093 1.1 mrg image3 = buf[3]; 4094 1.1 mrg } 4095 1.1 mrg image0 &= 0xffffffff; 4096 1.1 mrg image1 &= 0xffffffff; 4097 1.1 mrg image2 &= 0xffffffff; 4098 1.1 mrg 4099 1.1 mrg sign = (image3 >> 31) & 1; 4100 1.1 mrg exp = (image3 >> 16) & 0x7fff; 4101 1.1 mrg image3 &= 0xffff; 4102 1.1 mrg 4103 1.1 mrg memset (r, 0, sizeof (*r)); 4104 1.1 mrg 4105 1.1 mrg if (exp == 0) 4106 1.1 mrg { 4107 1.1 mrg if ((image3 | image2 | image1 | image0) && fmt->has_denorm) 4108 1.1 mrg { 4109 1.1 mrg r->cl = rvc_normal; 4110 1.1 mrg r->sign = sign; 4111 1.1 mrg 4112 1.1 mrg SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112)); 4113 1.1 mrg if (HOST_BITS_PER_LONG == 32) 4114 1.1 mrg { 4115 1.1 mrg r->sig[0] = image0; 4116 1.1 mrg r->sig[1] = image1; 4117 1.1 mrg r->sig[2] = image2; 4118 1.1 mrg r->sig[3] = image3; 4119 1.1 mrg } 4120 1.1 mrg else 4121 1.1 mrg { 4122 1.1 mrg r->sig[0] = (image1 << 31 << 1) | image0; 4123 1.1 mrg r->sig[1] = (image3 << 31 << 1) | image2; 4124 1.1 mrg } 4125 1.1 mrg 4126 1.1 mrg normalize (r); 4127 1.1 mrg } 4128 1.1 mrg else if (fmt->has_signed_zero) 4129 1.1 mrg r->sign = sign; 4130 1.1 mrg } 4131 1.1 mrg else if (exp == 32767 && (fmt->has_nans || fmt->has_inf)) 4132 1.1 mrg { 4133 1.1 mrg if (image3 | image2 | image1 | image0) 4134 1.1 mrg { 4135 1.1 mrg r->cl = rvc_nan; 4136 1.1 mrg r->sign = sign; 4137 1.1 mrg r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set; 4138 1.1 mrg 4139 1.1 mrg if (HOST_BITS_PER_LONG == 32) 4140 1.1 mrg { 4141 1.1 mrg r->sig[0] = image0; 4142 1.1 mrg r->sig[1] = image1; 4143 1.1 mrg r->sig[2] = image2; 4144 1.1 mrg r->sig[3] = image3; 4145 1.1 mrg } 4146 1.1 mrg else 4147 1.1 mrg { 4148 1.1 mrg r->sig[0] = (image1 << 31 << 1) | image0; 4149 1.1 mrg r->sig[1] = (image3 << 31 << 1) | image2; 4150 1.1 mrg } 4151 1.1 mrg lshift_significand (r, r, SIGNIFICAND_BITS - 113); 4152 1.1 mrg } 4153 1.1 mrg else 4154 1.1 mrg { 4155 1.1 mrg r->cl = rvc_inf; 4156 1.1 mrg r->sign = sign; 4157 1.1 mrg } 4158 1.1 mrg } 4159 1.1 mrg else 4160 1.1 mrg { 4161 1.1 mrg r->cl = rvc_normal; 4162 1.1 mrg r->sign = sign; 4163 1.1 mrg SET_REAL_EXP (r, exp - 16383 + 1); 4164 1.1 mrg 4165 1.1 mrg if (HOST_BITS_PER_LONG == 32) 4166 1.1 mrg { 4167 1.1 mrg r->sig[0] = image0; 4168 1.1 mrg r->sig[1] = image1; 4169 1.1 mrg r->sig[2] = image2; 4170 1.1 mrg r->sig[3] = image3; 4171 1.1 mrg } 4172 1.1 mrg else 4173 1.1 mrg { 4174 1.1 mrg r->sig[0] = (image1 << 31 << 1) | image0; 4175 1.1 mrg r->sig[1] = (image3 << 31 << 1) | image2; 4176 1.1 mrg } 4177 1.1 mrg lshift_significand (r, r, SIGNIFICAND_BITS - 113); 4178 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB; 4179 1.1 mrg } 4180 1.1 mrg } 4181 1.1 mrg 4182 1.1 mrg const struct real_format ieee_quad_format = 4183 1.1 mrg { 4184 1.1 mrg encode_ieee_quad, 4185 1.1 mrg decode_ieee_quad, 4186 1.1 mrg 2, 4187 1.1 mrg 113, 4188 1.1 mrg 113, 4189 1.1 mrg -16381, 4190 1.1 mrg 16384, 4191 1.1 mrg 127, 4192 1.1 mrg 127, 4193 1.1 mrg 128, 4194 1.1 mrg false, 4195 1.1 mrg true, 4196 1.1 mrg true, 4197 1.1 mrg true, 4198 1.1 mrg true, 4199 1.1 mrg true, 4200 1.1 mrg true, 4201 1.1 mrg false, 4202 1.1 mrg "ieee_quad" 4203 1.1 mrg }; 4204 1.1 mrg 4205 1.1 mrg const struct real_format mips_quad_format = 4206 1.1 mrg { 4207 1.1 mrg encode_ieee_quad, 4208 1.1 mrg decode_ieee_quad, 4209 1.1 mrg 2, 4210 1.1 mrg 113, 4211 1.1 mrg 113, 4212 1.1 mrg -16381, 4213 1.1 mrg 16384, 4214 1.1 mrg 127, 4215 1.1 mrg 127, 4216 1.1 mrg 128, 4217 1.1 mrg false, 4218 1.1 mrg true, 4219 1.1 mrg true, 4220 1.1 mrg true, 4221 1.1 mrg true, 4222 1.1 mrg true, 4223 1.1 mrg false, 4224 1.1 mrg true, 4225 1.1 mrg "mips_quad" 4226 1.1 mrg }; 4227 1.1 mrg 4228 1.1 mrg /* Descriptions of VAX floating point formats can be found beginning at 4230 1.1 mrg 4231 1.1 mrg http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format 4232 1.1 mrg 4233 1.1 mrg The thing to remember is that they're almost IEEE, except for word 4234 1.1 mrg order, exponent bias, and the lack of infinities, nans, and denormals. 4235 1.1 mrg 4236 1.1 mrg We don't implement the H_floating format here, simply because neither 4237 1.1 mrg the VAX or Alpha ports use it. */ 4238 1.1 mrg 4239 1.1 mrg static void encode_vax_f (const struct real_format *fmt, 4240 1.1 mrg long *, const REAL_VALUE_TYPE *); 4241 1.1 mrg static void decode_vax_f (const struct real_format *, 4242 1.1 mrg REAL_VALUE_TYPE *, const long *); 4243 1.1 mrg static void encode_vax_d (const struct real_format *fmt, 4244 1.1 mrg long *, const REAL_VALUE_TYPE *); 4245 1.1 mrg static void decode_vax_d (const struct real_format *, 4246 1.1 mrg REAL_VALUE_TYPE *, const long *); 4247 1.1 mrg static void encode_vax_g (const struct real_format *fmt, 4248 1.1 mrg long *, const REAL_VALUE_TYPE *); 4249 1.1 mrg static void decode_vax_g (const struct real_format *, 4250 1.1 mrg REAL_VALUE_TYPE *, const long *); 4251 1.1 mrg 4252 1.1 mrg static void 4253 1.1 mrg encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf, 4254 1.1 mrg const REAL_VALUE_TYPE *r) 4255 1.1 mrg { 4256 1.1 mrg unsigned long sign, exp, sig, image; 4257 1.1 mrg 4258 1.1 mrg sign = r->sign << 15; 4259 1.1 mrg 4260 1.1 mrg switch (r->cl) 4261 1.1 mrg { 4262 1.1 mrg case rvc_zero: 4263 1.1 mrg image = 0; 4264 1.1 mrg break; 4265 1.1 mrg 4266 1.1 mrg case rvc_inf: 4267 1.1 mrg case rvc_nan: 4268 1.1 mrg image = 0xffff7fff | sign; 4269 1.1 mrg break; 4270 1.1 mrg 4271 1.1 mrg case rvc_normal: 4272 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff; 4273 1.1 mrg exp = REAL_EXP (r) + 128; 4274 1.1 mrg 4275 1.1 mrg image = (sig << 16) & 0xffff0000; 4276 1.1 mrg image |= sign; 4277 1.1 mrg image |= exp << 7; 4278 1.1 mrg image |= sig >> 16; 4279 1.1 mrg break; 4280 1.1 mrg 4281 1.1 mrg default: 4282 1.1 mrg gcc_unreachable (); 4283 1.1 mrg } 4284 1.1 mrg 4285 1.1 mrg buf[0] = image; 4286 1.1 mrg } 4287 1.1 mrg 4288 1.1 mrg static void 4289 1.1 mrg decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, 4290 1.1 mrg REAL_VALUE_TYPE *r, const long *buf) 4291 1.1 mrg { 4292 1.1 mrg unsigned long image = buf[0] & 0xffffffff; 4293 1.1 mrg int exp = (image >> 7) & 0xff; 4294 1.1 mrg 4295 1.1 mrg memset (r, 0, sizeof (*r)); 4296 1.1 mrg 4297 1.1 mrg if (exp != 0) 4298 1.1 mrg { 4299 1.1 mrg r->cl = rvc_normal; 4300 1.1 mrg r->sign = (image >> 15) & 1; 4301 1.1 mrg SET_REAL_EXP (r, exp - 128); 4302 1.1 mrg 4303 1.1 mrg image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff); 4304 1.1 mrg r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB; 4305 1.1 mrg } 4306 1.1 mrg } 4307 1.1 mrg 4308 1.1 mrg static void 4309 1.1 mrg encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf, 4310 1.1 mrg const REAL_VALUE_TYPE *r) 4311 1.1 mrg { 4312 1.1 mrg unsigned long image0, image1, sign = r->sign << 15; 4313 1.1 mrg 4314 1.1 mrg switch (r->cl) 4315 1.1 mrg { 4316 1.1 mrg case rvc_zero: 4317 1.1 mrg image0 = image1 = 0; 4318 1.1 mrg break; 4319 1.1 mrg 4320 1.1 mrg case rvc_inf: 4321 1.1 mrg case rvc_nan: 4322 1.1 mrg image0 = 0xffff7fff | sign; 4323 1.1 mrg image1 = 0xffffffff; 4324 1.1 mrg break; 4325 1.1 mrg 4326 1.1 mrg case rvc_normal: 4327 1.1 mrg /* Extract the significand into straight hi:lo. */ 4328 1.1 mrg if (HOST_BITS_PER_LONG == 64) 4329 1.1 mrg { 4330 1.1 mrg image0 = r->sig[SIGSZ-1]; 4331 1.1 mrg image1 = (image0 >> (64 - 56)) & 0xffffffff; 4332 1.1 mrg image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff; 4333 1.1 mrg } 4334 1.1 mrg else 4335 1.1 mrg { 4336 1.1 mrg image0 = r->sig[SIGSZ-1]; 4337 1.1 mrg image1 = r->sig[SIGSZ-2]; 4338 1.1 mrg image1 = (image0 << 24) | (image1 >> 8); 4339 1.1 mrg image0 = (image0 >> 8) & 0xffffff; 4340 1.1 mrg } 4341 1.1 mrg 4342 1.1 mrg /* Rearrange the half-words of the significand to match the 4343 1.1 mrg external format. */ 4344 1.1 mrg image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f; 4345 1.1 mrg image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff; 4346 1.1 mrg 4347 1.1 mrg /* Add the sign and exponent. */ 4348 1.1 mrg image0 |= sign; 4349 1.1 mrg image0 |= (REAL_EXP (r) + 128) << 7; 4350 1.1 mrg break; 4351 1.1 mrg 4352 1.1 mrg default: 4353 1.1 mrg gcc_unreachable (); 4354 1.1 mrg } 4355 1.1 mrg 4356 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 4357 1.1 mrg buf[0] = image1, buf[1] = image0; 4358 1.1 mrg else 4359 1.1 mrg buf[0] = image0, buf[1] = image1; 4360 1.1 mrg } 4361 1.1 mrg 4362 1.1 mrg static void 4363 1.1 mrg decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, 4364 1.1 mrg REAL_VALUE_TYPE *r, const long *buf) 4365 1.1 mrg { 4366 1.1 mrg unsigned long image0, image1; 4367 1.1 mrg int exp; 4368 1.1 mrg 4369 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 4370 1.1 mrg image1 = buf[0], image0 = buf[1]; 4371 1.1 mrg else 4372 1.1 mrg image0 = buf[0], image1 = buf[1]; 4373 1.1 mrg image0 &= 0xffffffff; 4374 1.1 mrg image1 &= 0xffffffff; 4375 1.1 mrg 4376 1.1 mrg exp = (image0 >> 7) & 0xff; 4377 1.1 mrg 4378 1.1 mrg memset (r, 0, sizeof (*r)); 4379 1.1 mrg 4380 1.1 mrg if (exp != 0) 4381 1.1 mrg { 4382 1.1 mrg r->cl = rvc_normal; 4383 1.1 mrg r->sign = (image0 >> 15) & 1; 4384 1.1 mrg SET_REAL_EXP (r, exp - 128); 4385 1.1 mrg 4386 1.1 mrg /* Rearrange the half-words of the external format into 4387 1.1 mrg proper ascending order. */ 4388 1.1 mrg image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff); 4389 1.1 mrg image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff); 4390 1.1 mrg 4391 1.1 mrg if (HOST_BITS_PER_LONG == 64) 4392 1.1 mrg { 4393 1.1 mrg image0 = (image0 << 31 << 1) | image1; 4394 1.1 mrg image0 <<= 64 - 56; 4395 1.1 mrg image0 |= SIG_MSB; 4396 1.1 mrg r->sig[SIGSZ-1] = image0; 4397 1.1 mrg } 4398 1.1 mrg else 4399 1.1 mrg { 4400 1.1 mrg r->sig[SIGSZ-1] = image0; 4401 1.1 mrg r->sig[SIGSZ-2] = image1; 4402 1.1 mrg lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56); 4403 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB; 4404 1.1 mrg } 4405 1.1 mrg } 4406 1.1 mrg } 4407 1.1 mrg 4408 1.1 mrg static void 4409 1.1 mrg encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf, 4410 1.1 mrg const REAL_VALUE_TYPE *r) 4411 1.1 mrg { 4412 1.1 mrg unsigned long image0, image1, sign = r->sign << 15; 4413 1.1 mrg 4414 1.1 mrg switch (r->cl) 4415 1.1 mrg { 4416 1.1 mrg case rvc_zero: 4417 1.1 mrg image0 = image1 = 0; 4418 1.1 mrg break; 4419 1.1 mrg 4420 1.1 mrg case rvc_inf: 4421 1.1 mrg case rvc_nan: 4422 1.1 mrg image0 = 0xffff7fff | sign; 4423 1.1 mrg image1 = 0xffffffff; 4424 1.1 mrg break; 4425 1.1 mrg 4426 1.1 mrg case rvc_normal: 4427 1.1 mrg /* Extract the significand into straight hi:lo. */ 4428 1.1 mrg if (HOST_BITS_PER_LONG == 64) 4429 1.1 mrg { 4430 1.1 mrg image0 = r->sig[SIGSZ-1]; 4431 1.1 mrg image1 = (image0 >> (64 - 53)) & 0xffffffff; 4432 1.1 mrg image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff; 4433 1.1 mrg } 4434 1.1 mrg else 4435 1.1 mrg { 4436 1.1 mrg image0 = r->sig[SIGSZ-1]; 4437 1.1 mrg image1 = r->sig[SIGSZ-2]; 4438 1.1 mrg image1 = (image0 << 21) | (image1 >> 11); 4439 1.1 mrg image0 = (image0 >> 11) & 0xfffff; 4440 1.1 mrg } 4441 1.1 mrg 4442 1.1 mrg /* Rearrange the half-words of the significand to match the 4443 1.1 mrg external format. */ 4444 1.1 mrg image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f; 4445 1.1 mrg image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff; 4446 1.1 mrg 4447 1.1 mrg /* Add the sign and exponent. */ 4448 1.1 mrg image0 |= sign; 4449 1.1 mrg image0 |= (REAL_EXP (r) + 1024) << 4; 4450 1.1 mrg break; 4451 1.1 mrg 4452 1.1 mrg default: 4453 1.1 mrg gcc_unreachable (); 4454 1.1 mrg } 4455 1.1 mrg 4456 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 4457 1.1 mrg buf[0] = image1, buf[1] = image0; 4458 1.1 mrg else 4459 1.1 mrg buf[0] = image0, buf[1] = image1; 4460 1.1 mrg } 4461 1.1 mrg 4462 1.1 mrg static void 4463 1.1 mrg decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, 4464 1.1 mrg REAL_VALUE_TYPE *r, const long *buf) 4465 1.1 mrg { 4466 1.1 mrg unsigned long image0, image1; 4467 1.1 mrg int exp; 4468 1.1 mrg 4469 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN) 4470 1.1 mrg image1 = buf[0], image0 = buf[1]; 4471 1.1 mrg else 4472 1.1 mrg image0 = buf[0], image1 = buf[1]; 4473 1.1 mrg image0 &= 0xffffffff; 4474 1.1 mrg image1 &= 0xffffffff; 4475 1.1 mrg 4476 1.1 mrg exp = (image0 >> 4) & 0x7ff; 4477 1.1 mrg 4478 1.1 mrg memset (r, 0, sizeof (*r)); 4479 1.1 mrg 4480 1.1 mrg if (exp != 0) 4481 1.1 mrg { 4482 1.1 mrg r->cl = rvc_normal; 4483 1.1 mrg r->sign = (image0 >> 15) & 1; 4484 1.1 mrg SET_REAL_EXP (r, exp - 1024); 4485 1.1 mrg 4486 1.1 mrg /* Rearrange the half-words of the external format into 4487 1.1 mrg proper ascending order. */ 4488 1.1 mrg image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff); 4489 1.1 mrg image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff); 4490 1.1 mrg 4491 1.1 mrg if (HOST_BITS_PER_LONG == 64) 4492 1.1 mrg { 4493 1.1 mrg image0 = (image0 << 31 << 1) | image1; 4494 1.1 mrg image0 <<= 64 - 53; 4495 1.1 mrg image0 |= SIG_MSB; 4496 1.1 mrg r->sig[SIGSZ-1] = image0; 4497 1.1 mrg } 4498 1.1 mrg else 4499 1.1 mrg { 4500 1.1 mrg r->sig[SIGSZ-1] = image0; 4501 1.1 mrg r->sig[SIGSZ-2] = image1; 4502 1.1 mrg lshift_significand (r, r, 64 - 53); 4503 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB; 4504 1.1 mrg } 4505 1.1 mrg } 4506 1.1 mrg } 4507 1.1 mrg 4508 1.1 mrg const struct real_format vax_f_format = 4509 1.1 mrg { 4510 1.1 mrg encode_vax_f, 4511 1.1 mrg decode_vax_f, 4512 1.1 mrg 2, 4513 1.1 mrg 24, 4514 1.1 mrg 24, 4515 1.1 mrg -127, 4516 1.1 mrg 127, 4517 1.1 mrg 15, 4518 1.1 mrg 15, 4519 1.1 mrg 0, 4520 1.1 mrg false, 4521 1.1 mrg false, 4522 1.1 mrg false, 4523 1.1 mrg false, 4524 1.1 mrg false, 4525 1.1 mrg false, 4526 1.1 mrg false, 4527 1.1 mrg false, 4528 1.1 mrg "vax_f" 4529 1.1 mrg }; 4530 1.1 mrg 4531 1.1 mrg const struct real_format vax_d_format = 4532 1.1 mrg { 4533 1.1 mrg encode_vax_d, 4534 1.1 mrg decode_vax_d, 4535 1.1 mrg 2, 4536 1.1 mrg 56, 4537 1.1 mrg 56, 4538 1.1 mrg -127, 4539 1.1 mrg 127, 4540 1.1 mrg 15, 4541 1.1 mrg 15, 4542 1.1 mrg 0, 4543 1.1 mrg false, 4544 1.1 mrg false, 4545 1.1 mrg false, 4546 1.1 mrg false, 4547 1.1 mrg false, 4548 1.1 mrg false, 4549 1.1 mrg false, 4550 1.1 mrg false, 4551 1.1 mrg "vax_d" 4552 1.1 mrg }; 4553 1.1 mrg 4554 1.1 mrg const struct real_format vax_g_format = 4555 1.1 mrg { 4556 1.1 mrg encode_vax_g, 4557 1.1 mrg decode_vax_g, 4558 1.1 mrg 2, 4559 1.1 mrg 53, 4560 1.1 mrg 53, 4561 1.1 mrg -1023, 4562 1.1 mrg 1023, 4563 1.1 mrg 15, 4564 1.1 mrg 15, 4565 1.1 mrg 0, 4566 1.1 mrg false, 4567 1.1 mrg false, 4568 1.1 mrg false, 4569 1.1 mrg false, 4570 1.1 mrg false, 4571 1.1 mrg false, 4572 1.1 mrg false, 4573 1.1 mrg false, 4574 1.1 mrg "vax_g" 4575 1.1 mrg }; 4576 1.1 mrg 4577 1.1 mrg /* Encode real R into a single precision DFP value in BUF. */ 4579 1.1 mrg static void 4580 1.1 mrg encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED, 4581 1.1 mrg long *buf ATTRIBUTE_UNUSED, 4582 1.1 mrg const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED) 4583 1.1 mrg { 4584 1.1 mrg encode_decimal32 (fmt, buf, r); 4585 1.1 mrg } 4586 1.1 mrg 4587 1.1 mrg /* Decode a single precision DFP value in BUF into a real R. */ 4588 1.1 mrg static void 4589 1.1 mrg decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED, 4590 1.1 mrg REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED, 4591 1.1 mrg const long *buf ATTRIBUTE_UNUSED) 4592 1.1 mrg { 4593 1.1 mrg decode_decimal32 (fmt, r, buf); 4594 1.1 mrg } 4595 1.1 mrg 4596 1.1 mrg /* Encode real R into a double precision DFP value in BUF. */ 4597 1.1 mrg static void 4598 1.1 mrg encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED, 4599 1.1 mrg long *buf ATTRIBUTE_UNUSED, 4600 1.1 mrg const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED) 4601 1.1 mrg { 4602 1.1 mrg encode_decimal64 (fmt, buf, r); 4603 1.1 mrg } 4604 1.1 mrg 4605 1.1 mrg /* Decode a double precision DFP value in BUF into a real R. */ 4606 1.1 mrg static void 4607 1.1 mrg decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED, 4608 1.1 mrg REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED, 4609 1.1 mrg const long *buf ATTRIBUTE_UNUSED) 4610 1.1 mrg { 4611 1.1 mrg decode_decimal64 (fmt, r, buf); 4612 1.1 mrg } 4613 1.1 mrg 4614 1.1 mrg /* Encode real R into a quad precision DFP value in BUF. */ 4615 1.1 mrg static void 4616 1.1 mrg encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED, 4617 1.1 mrg long *buf ATTRIBUTE_UNUSED, 4618 1.1 mrg const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED) 4619 1.1 mrg { 4620 1.1 mrg encode_decimal128 (fmt, buf, r); 4621 1.1 mrg } 4622 1.1 mrg 4623 1.1 mrg /* Decode a quad precision DFP value in BUF into a real R. */ 4624 1.1 mrg static void 4625 1.1 mrg decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED, 4626 1.1 mrg REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED, 4627 1.1 mrg const long *buf ATTRIBUTE_UNUSED) 4628 1.1 mrg { 4629 1.1 mrg decode_decimal128 (fmt, r, buf); 4630 1.1 mrg } 4631 1.1 mrg 4632 1.1 mrg /* Single precision decimal floating point (IEEE 754). */ 4633 1.1 mrg const struct real_format decimal_single_format = 4634 1.1 mrg { 4635 1.1 mrg encode_decimal_single, 4636 1.1 mrg decode_decimal_single, 4637 1.1 mrg 10, 4638 1.1 mrg 7, 4639 1.1 mrg 7, 4640 1.1 mrg -94, 4641 1.1 mrg 97, 4642 1.1 mrg 31, 4643 1.1 mrg 31, 4644 1.1 mrg 32, 4645 1.1 mrg false, 4646 1.1 mrg true, 4647 1.1 mrg true, 4648 1.1 mrg true, 4649 1.1 mrg true, 4650 1.1 mrg true, 4651 1.1 mrg true, 4652 1.1 mrg false, 4653 1.1 mrg "decimal_single" 4654 1.1 mrg }; 4655 1.1 mrg 4656 1.1 mrg /* Double precision decimal floating point (IEEE 754). */ 4657 1.1 mrg const struct real_format decimal_double_format = 4658 1.1 mrg { 4659 1.1 mrg encode_decimal_double, 4660 1.1 mrg decode_decimal_double, 4661 1.1 mrg 10, 4662 1.1 mrg 16, 4663 1.1 mrg 16, 4664 1.1 mrg -382, 4665 1.1 mrg 385, 4666 1.1 mrg 63, 4667 1.1 mrg 63, 4668 1.1 mrg 64, 4669 1.1 mrg false, 4670 1.1 mrg true, 4671 1.1 mrg true, 4672 1.1 mrg true, 4673 1.1 mrg true, 4674 1.1 mrg true, 4675 1.1 mrg true, 4676 1.1 mrg false, 4677 1.1 mrg "decimal_double" 4678 1.1 mrg }; 4679 1.1 mrg 4680 1.1 mrg /* Quad precision decimal floating point (IEEE 754). */ 4681 1.1 mrg const struct real_format decimal_quad_format = 4682 1.1 mrg { 4683 1.1 mrg encode_decimal_quad, 4684 1.1 mrg decode_decimal_quad, 4685 1.1 mrg 10, 4686 1.1 mrg 34, 4687 1.1 mrg 34, 4688 1.1 mrg -6142, 4689 1.1 mrg 6145, 4690 1.1 mrg 127, 4691 1.1 mrg 127, 4692 1.1 mrg 128, 4693 1.1 mrg false, 4694 1.1 mrg true, 4695 1.1 mrg true, 4696 1.1 mrg true, 4697 1.1 mrg true, 4698 1.1 mrg true, 4699 1.1 mrg true, 4700 1.1 mrg false, 4701 1.1 mrg "decimal_quad" 4702 1.1 mrg }; 4703 1.1 mrg 4704 1.1 mrg /* Encode half-precision floats. This routine is used both for the IEEE 4706 1.1 mrg ARM alternative encodings. */ 4707 1.1 mrg static void 4708 1.1 mrg encode_ieee_half (const struct real_format *fmt, long *buf, 4709 1.1 mrg const REAL_VALUE_TYPE *r) 4710 1.1 mrg { 4711 1.1 mrg unsigned long image, sig, exp; 4712 1.1 mrg unsigned long sign = r->sign; 4713 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0; 4714 1.1 mrg 4715 1.1 mrg image = sign << 15; 4716 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 11)) & 0x3ff; 4717 1.1 mrg 4718 1.1 mrg switch (r->cl) 4719 1.1 mrg { 4720 1.1 mrg case rvc_zero: 4721 1.1 mrg break; 4722 1.1 mrg 4723 1.1 mrg case rvc_inf: 4724 1.1 mrg if (fmt->has_inf) 4725 1.1 mrg image |= 31 << 10; 4726 1.1 mrg else 4727 1.1 mrg image |= 0x7fff; 4728 1.1 mrg break; 4729 1.1 mrg 4730 1.1 mrg case rvc_nan: 4731 1.1 mrg if (fmt->has_nans) 4732 1.1 mrg { 4733 1.1 mrg if (r->canonical) 4734 1.1 mrg sig = (fmt->canonical_nan_lsbs_set ? (1 << 9) - 1 : 0); 4735 1.1 mrg if (r->signalling == fmt->qnan_msb_set) 4736 1.1 mrg sig &= ~(1 << 9); 4737 1.1 mrg else 4738 1.1 mrg sig |= 1 << 9; 4739 1.1 mrg if (sig == 0) 4740 1.1 mrg sig = 1 << 8; 4741 1.1 mrg 4742 1.1 mrg image |= 31 << 10; 4743 1.1 mrg image |= sig; 4744 1.1 mrg } 4745 1.1 mrg else 4746 1.1 mrg image |= 0x3ff; 4747 1.1 mrg break; 4748 1.1 mrg 4749 1.1 mrg case rvc_normal: 4750 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp, 4751 1.1 mrg whereas the intermediate representation is 0.F x 2**exp. 4752 1.1 mrg Which means we're off by one. */ 4753 1.1 mrg if (denormal) 4754 1.1 mrg exp = 0; 4755 1.1 mrg else 4756 1.1 mrg exp = REAL_EXP (r) + 15 - 1; 4757 1.1 mrg image |= exp << 10; 4758 1.1 mrg image |= sig; 4759 1.1 mrg break; 4760 1.1 mrg 4761 1.1 mrg default: 4762 1.1 mrg gcc_unreachable (); 4763 1.1 mrg } 4764 1.1 mrg 4765 1.1 mrg buf[0] = image; 4766 1.1 mrg } 4767 1.1 mrg 4768 1.1 mrg /* Decode half-precision floats. This routine is used both for the IEEE 4769 1.1 mrg ARM alternative encodings. */ 4770 1.1 mrg static void 4771 1.1 mrg decode_ieee_half (const struct real_format *fmt, REAL_VALUE_TYPE *r, 4772 1.1 mrg const long *buf) 4773 1.1 mrg { 4774 1.1 mrg unsigned long image = buf[0] & 0xffff; 4775 1.1 mrg bool sign = (image >> 15) & 1; 4776 1.1 mrg int exp = (image >> 10) & 0x1f; 4777 1.1 mrg 4778 1.1 mrg memset (r, 0, sizeof (*r)); 4779 1.1 mrg image <<= HOST_BITS_PER_LONG - 11; 4780 1.1 mrg image &= ~SIG_MSB; 4781 1.1 mrg 4782 1.1 mrg if (exp == 0) 4783 1.1 mrg { 4784 1.1 mrg if (image && fmt->has_denorm) 4785 1.1 mrg { 4786 1.1 mrg r->cl = rvc_normal; 4787 1.1 mrg r->sign = sign; 4788 1.1 mrg SET_REAL_EXP (r, -14); 4789 1.1 mrg r->sig[SIGSZ-1] = image << 1; 4790 1.1 mrg normalize (r); 4791 1.1 mrg } 4792 1.1 mrg else if (fmt->has_signed_zero) 4793 1.1 mrg r->sign = sign; 4794 1.1 mrg } 4795 1.1 mrg else if (exp == 31 && (fmt->has_nans || fmt->has_inf)) 4796 1.1 mrg { 4797 1.1 mrg if (image) 4798 1.1 mrg { 4799 1.1 mrg r->cl = rvc_nan; 4800 1.1 mrg r->sign = sign; 4801 1.1 mrg r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1) 4802 1.1 mrg ^ fmt->qnan_msb_set); 4803 1.1 mrg r->sig[SIGSZ-1] = image; 4804 1.1 mrg } 4805 1.1 mrg else 4806 1.1 mrg { 4807 1.1 mrg r->cl = rvc_inf; 4808 1.1 mrg r->sign = sign; 4809 1.1 mrg } 4810 1.1 mrg } 4811 1.1 mrg else 4812 1.1 mrg { 4813 1.1 mrg r->cl = rvc_normal; 4814 1.1 mrg r->sign = sign; 4815 1.1 mrg SET_REAL_EXP (r, exp - 15 + 1); 4816 1.1 mrg r->sig[SIGSZ-1] = image | SIG_MSB; 4817 1.1 mrg } 4818 1.1 mrg } 4819 1.1 mrg 4820 1.1 mrg /* Encode arm_bfloat types. */ 4821 1.1 mrg static void 4822 1.1 mrg encode_arm_bfloat_half (const struct real_format *fmt, long *buf, 4823 1.1 mrg const REAL_VALUE_TYPE *r) 4824 1.1 mrg { 4825 1.1 mrg unsigned long image, sig, exp; 4826 1.1 mrg unsigned long sign = r->sign; 4827 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0; 4828 1.1 mrg 4829 1.1 mrg image = sign << 15; 4830 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 8)) & 0x7f; 4831 1.1 mrg 4832 1.1 mrg switch (r->cl) 4833 1.1 mrg { 4834 1.1 mrg case rvc_zero: 4835 1.1 mrg break; 4836 1.1 mrg 4837 1.1 mrg case rvc_inf: 4838 1.1 mrg if (fmt->has_inf) 4839 1.1 mrg image |= 255 << 7; 4840 1.1 mrg else 4841 1.1 mrg image |= 0x7fff; 4842 1.1 mrg break; 4843 1.1 mrg 4844 1.1 mrg case rvc_nan: 4845 1.1 mrg if (fmt->has_nans) 4846 1.1 mrg { 4847 1.1 mrg if (r->canonical) 4848 1.1 mrg sig = (fmt->canonical_nan_lsbs_set ? (1 << 6) - 1 : 0); 4849 1.1 mrg if (r->signalling == fmt->qnan_msb_set) 4850 1.1 mrg sig &= ~(1 << 6); 4851 1.1 mrg else 4852 1.1 mrg sig |= 1 << 6; 4853 1.1 mrg if (sig == 0) 4854 1.1 mrg sig = 1 << 5; 4855 1.1 mrg 4856 1.1 mrg image |= 255 << 7; 4857 1.1 mrg image |= sig; 4858 1.1 mrg } 4859 1.1 mrg else 4860 1.1 mrg image |= 0x7fff; 4861 1.1 mrg break; 4862 1.1 mrg 4863 1.1 mrg case rvc_normal: 4864 1.1 mrg if (denormal) 4865 1.1 mrg exp = 0; 4866 1.1 mrg else 4867 1.1 mrg exp = REAL_EXP (r) + 127 - 1; 4868 1.1 mrg image |= exp << 7; 4869 1.1 mrg image |= sig; 4870 1.1 mrg break; 4871 1.1 mrg 4872 1.1 mrg default: 4873 1.1 mrg gcc_unreachable (); 4874 1.1 mrg } 4875 1.1 mrg 4876 1.1 mrg buf[0] = image; 4877 1.1 mrg } 4878 1.1 mrg 4879 1.1 mrg /* Decode arm_bfloat types. */ 4880 1.1 mrg static void 4881 1.1 mrg decode_arm_bfloat_half (const struct real_format *fmt, REAL_VALUE_TYPE *r, 4882 1.1 mrg const long *buf) 4883 1.1 mrg { 4884 1.1 mrg unsigned long image = buf[0] & 0xffff; 4885 1.1 mrg bool sign = (image >> 15) & 1; 4886 1.1 mrg int exp = (image >> 7) & 0xff; 4887 1.1 mrg 4888 1.1 mrg memset (r, 0, sizeof (*r)); 4889 1.1 mrg image <<= HOST_BITS_PER_LONG - 8; 4890 1.1 mrg image &= ~SIG_MSB; 4891 1.1 mrg 4892 1.1 mrg if (exp == 0) 4893 1.1 mrg { 4894 1.1 mrg if (image && fmt->has_denorm) 4895 1.1 mrg { 4896 1.1 mrg r->cl = rvc_normal; 4897 1.1 mrg r->sign = sign; 4898 1.1 mrg SET_REAL_EXP (r, -126); 4899 1.1 mrg r->sig[SIGSZ-1] = image << 1; 4900 1.1 mrg normalize (r); 4901 1.1 mrg } 4902 1.1 mrg else if (fmt->has_signed_zero) 4903 1.1 mrg r->sign = sign; 4904 1.1 mrg } 4905 1.1 mrg else if (exp == 255 && (fmt->has_nans || fmt->has_inf)) 4906 1.1 mrg { 4907 1.1 mrg if (image) 4908 1.1 mrg { 4909 1.1 mrg r->cl = rvc_nan; 4910 1.1 mrg r->sign = sign; 4911 1.1 mrg r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1) 4912 1.1 mrg ^ fmt->qnan_msb_set); 4913 1.1 mrg r->sig[SIGSZ-1] = image; 4914 1.1 mrg } 4915 1.1 mrg else 4916 1.1 mrg { 4917 1.1 mrg r->cl = rvc_inf; 4918 1.1 mrg r->sign = sign; 4919 1.1 mrg } 4920 1.1 mrg } 4921 1.1 mrg else 4922 1.1 mrg { 4923 1.1 mrg r->cl = rvc_normal; 4924 1.1 mrg r->sign = sign; 4925 1.1 mrg SET_REAL_EXP (r, exp - 127 + 1); 4926 1.1 mrg r->sig[SIGSZ-1] = image | SIG_MSB; 4927 1.1 mrg } 4928 1.1 mrg } 4929 1.1 mrg 4930 1.1 mrg /* Half-precision format, as specified in IEEE 754R. */ 4931 1.1 mrg const struct real_format ieee_half_format = 4932 1.1 mrg { 4933 1.1 mrg encode_ieee_half, 4934 1.1 mrg decode_ieee_half, 4935 1.1 mrg 2, 4936 1.1 mrg 11, 4937 1.1 mrg 11, 4938 1.1 mrg -13, 4939 1.1 mrg 16, 4940 1.1 mrg 15, 4941 1.1 mrg 15, 4942 1.1 mrg 16, 4943 1.1 mrg false, 4944 1.1 mrg true, 4945 1.1 mrg true, 4946 1.1 mrg true, 4947 1.1 mrg true, 4948 1.1 mrg true, 4949 1.1 mrg true, 4950 1.1 mrg false, 4951 1.1 mrg "ieee_half" 4952 1.1 mrg }; 4953 1.1 mrg 4954 1.1 mrg /* ARM's alternative half-precision format, similar to IEEE but with 4955 1.1 mrg no reserved exponent value for NaNs and infinities; rather, it just 4956 1.1 mrg extends the range of exponents by one. */ 4957 1.1 mrg const struct real_format arm_half_format = 4958 1.1 mrg { 4959 1.1 mrg encode_ieee_half, 4960 1.1 mrg decode_ieee_half, 4961 1.1 mrg 2, 4962 1.1 mrg 11, 4963 1.1 mrg 11, 4964 1.1 mrg -13, 4965 1.1 mrg 17, 4966 1.1 mrg 15, 4967 1.1 mrg 15, 4968 1.1 mrg 0, 4969 1.1 mrg false, 4970 1.1 mrg true, 4971 1.1 mrg false, 4972 1.1 mrg false, 4973 1.1 mrg true, 4974 1.1 mrg true, 4975 1.1 mrg false, 4976 1.1 mrg false, 4977 1.1 mrg "arm_half" 4978 1.1 mrg }; 4979 1.1 mrg 4980 1.1 mrg /* ARM Bfloat half-precision format. This format resembles a truncated 4981 1.1 mrg (16-bit) version of the 32-bit IEEE 754 single-precision floating-point 4982 1.1 mrg format. */ 4983 1.1 mrg const struct real_format arm_bfloat_half_format = 4984 1.1 mrg { 4985 1.1 mrg encode_arm_bfloat_half, 4986 1.1 mrg decode_arm_bfloat_half, 4987 1.1 mrg 2, 4988 1.1 mrg 8, 4989 1.1 mrg 8, 4990 1.1 mrg -125, 4991 1.1 mrg 128, 4992 1.1 mrg 15, 4993 1.1 mrg 15, 4994 1.1 mrg 0, 4995 1.1 mrg false, 4996 1.1 mrg true, 4997 1.1 mrg true, 4998 1.1 mrg true, 4999 1.1 mrg true, 5000 1.1 mrg true, 5001 1.1 mrg true, 5002 1.1 mrg false, 5003 1.1 mrg "arm_bfloat_half" 5004 1.1 mrg }; 5005 1.1 mrg 5006 1.1 mrg 5007 1.1 mrg /* A synthetic "format" for internal arithmetic. It's the size of the 5009 1.1 mrg internal significand minus the two bits needed for proper rounding. 5010 1.1 mrg The encode and decode routines exist only to satisfy our paranoia 5011 1.1 mrg harness. */ 5012 1.1 mrg 5013 1.1 mrg static void encode_internal (const struct real_format *fmt, 5014 1.1 mrg long *, const REAL_VALUE_TYPE *); 5015 1.1 mrg static void decode_internal (const struct real_format *, 5016 1.1 mrg REAL_VALUE_TYPE *, const long *); 5017 1.1 mrg 5018 1.1 mrg static void 5019 1.1 mrg encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf, 5020 1.1 mrg const REAL_VALUE_TYPE *r) 5021 1.1 mrg { 5022 1.1 mrg memcpy (buf, r, sizeof (*r)); 5023 1.1 mrg } 5024 1.1 mrg 5025 1.1 mrg static void 5026 1.1 mrg decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, 5027 1.1 mrg REAL_VALUE_TYPE *r, const long *buf) 5028 1.1 mrg { 5029 1.1 mrg memcpy (r, buf, sizeof (*r)); 5030 1.1 mrg } 5031 1.1 mrg 5032 1.1 mrg const struct real_format real_internal_format = 5033 1.1 mrg { 5034 1.1 mrg encode_internal, 5035 1.1 mrg decode_internal, 5036 1.1 mrg 2, 5037 1.1 mrg SIGNIFICAND_BITS - 2, 5038 1.1 mrg SIGNIFICAND_BITS - 2, 5039 1.1 mrg -MAX_EXP, 5040 1.1 mrg MAX_EXP, 5041 1.1 mrg -1, 5042 1.1 mrg -1, 5043 1.1 mrg 0, 5044 1.1 mrg false, 5045 1.1 mrg false, 5046 1.1 mrg true, 5047 1.1 mrg true, 5048 1.1 mrg false, 5049 1.1 mrg true, 5050 1.1 mrg true, 5051 1.1 mrg false, 5052 1.1 mrg "real_internal" 5053 1.1 mrg }; 5054 1.1 mrg 5055 1.1 mrg /* Calculate X raised to the integer exponent N in format FMT and store 5057 1.1 mrg the result in R. Return true if the result may be inexact due to 5058 1.1 mrg loss of precision. The algorithm is the classic "left-to-right binary 5059 1.1 mrg method" described in section 4.6.3 of Donald Knuth's "Seminumerical 5060 1.1 mrg Algorithms", "The Art of Computer Programming", Volume 2. */ 5061 1.1 mrg 5062 1.1 mrg bool 5063 1.1 mrg real_powi (REAL_VALUE_TYPE *r, format_helper fmt, 5064 1.1 mrg const REAL_VALUE_TYPE *x, HOST_WIDE_INT n) 5065 1.1 mrg { 5066 1.1 mrg unsigned HOST_WIDE_INT bit; 5067 1.1 mrg REAL_VALUE_TYPE t; 5068 1.1 mrg bool inexact = false; 5069 1.1 mrg bool init = false; 5070 1.1 mrg bool neg; 5071 1.1 mrg int i; 5072 1.1 mrg 5073 1.1 mrg if (n == 0) 5074 1.1 mrg { 5075 1.1 mrg *r = dconst1; 5076 1.1 mrg return false; 5077 1.1 mrg } 5078 1.1 mrg else if (n < 0) 5079 1.1 mrg { 5080 1.1 mrg /* Don't worry about overflow, from now on n is unsigned. */ 5081 1.1 mrg neg = true; 5082 1.1 mrg n = -n; 5083 1.1 mrg } 5084 1.1 mrg else 5085 1.1 mrg neg = false; 5086 1.1 mrg 5087 1.1 mrg t = *x; 5088 1.1 mrg bit = HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1); 5089 1.1 mrg for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++) 5090 1.1 mrg { 5091 1.1 mrg if (init) 5092 1.1 mrg { 5093 1.1 mrg inexact |= do_multiply (&t, &t, &t); 5094 1.1 mrg if (n & bit) 5095 1.1 mrg inexact |= do_multiply (&t, &t, x); 5096 1.1 mrg } 5097 1.1 mrg else if (n & bit) 5098 1.1 mrg init = true; 5099 1.1 mrg bit >>= 1; 5100 1.1 mrg } 5101 1.1 mrg 5102 1.1 mrg if (neg) 5103 1.1 mrg inexact |= do_divide (&t, &dconst1, &t); 5104 1.1 mrg 5105 1.1 mrg real_convert (r, fmt, &t); 5106 1.1 mrg return inexact; 5107 1.1 mrg } 5108 1.1 mrg 5109 1.1 mrg /* Round X to the nearest integer not larger in absolute value, i.e. 5110 1.1 mrg towards zero, placing the result in R in format FMT. */ 5111 1.1 mrg 5112 1.1 mrg void 5113 1.1 mrg real_trunc (REAL_VALUE_TYPE *r, format_helper fmt, 5114 1.1 mrg const REAL_VALUE_TYPE *x) 5115 1.1 mrg { 5116 1.1 mrg do_fix_trunc (r, x); 5117 1.1 mrg if (fmt) 5118 1.1 mrg real_convert (r, fmt, r); 5119 1.1 mrg } 5120 1.1 mrg 5121 1.1 mrg /* Round X to the largest integer not greater in value, i.e. round 5122 1.1 mrg down, placing the result in R in format FMT. */ 5123 1.1 mrg 5124 1.1 mrg void 5125 1.1 mrg real_floor (REAL_VALUE_TYPE *r, format_helper fmt, 5126 1.1 mrg const REAL_VALUE_TYPE *x) 5127 1.1 mrg { 5128 1.1 mrg REAL_VALUE_TYPE t; 5129 1.1 mrg 5130 1.1 mrg do_fix_trunc (&t, x); 5131 1.1 mrg if (! real_identical (&t, x) && x->sign) 5132 1.1 mrg do_add (&t, &t, &dconstm1, 0); 5133 1.1 mrg if (fmt) 5134 1.1 mrg real_convert (r, fmt, &t); 5135 1.1 mrg else 5136 1.1 mrg *r = t; 5137 1.1 mrg } 5138 1.1 mrg 5139 1.1 mrg /* Round X to the smallest integer not less then argument, i.e. round 5140 1.1 mrg up, placing the result in R in format FMT. */ 5141 1.1 mrg 5142 1.1 mrg void 5143 1.1 mrg real_ceil (REAL_VALUE_TYPE *r, format_helper fmt, 5144 1.1 mrg const REAL_VALUE_TYPE *x) 5145 1.1 mrg { 5146 1.1 mrg REAL_VALUE_TYPE t; 5147 1.1 mrg 5148 1.1 mrg do_fix_trunc (&t, x); 5149 1.1 mrg if (! real_identical (&t, x) && ! x->sign) 5150 1.1 mrg do_add (&t, &t, &dconst1, 0); 5151 1.1 mrg if (fmt) 5152 1.1 mrg real_convert (r, fmt, &t); 5153 1.1 mrg else 5154 1.1 mrg *r = t; 5155 1.1 mrg } 5156 1.1 mrg 5157 1.1 mrg /* Round X to the nearest integer, but round halfway cases away from 5158 1.1 mrg zero. */ 5159 1.1 mrg 5160 1.1 mrg void 5161 1.1 mrg real_round (REAL_VALUE_TYPE *r, format_helper fmt, 5162 1.1 mrg const REAL_VALUE_TYPE *x) 5163 1.1 mrg { 5164 1.1 mrg do_add (r, x, &dconsthalf, x->sign); 5165 1.1 mrg do_fix_trunc (r, r); 5166 1.1 mrg if (fmt) 5167 1.1 mrg real_convert (r, fmt, r); 5168 1.1 mrg } 5169 1.1 mrg 5170 1.1 mrg /* Return true (including 0) if integer part of R is even, else return 5171 1.1 mrg false. The function is not valid for rvc_inf and rvc_nan classes. */ 5172 1.1 mrg 5173 1.1 mrg static bool 5174 1.1 mrg is_even (REAL_VALUE_TYPE *r) 5175 1.1 mrg { 5176 1.1 mrg gcc_assert (r->cl != rvc_inf); 5177 1.1 mrg gcc_assert (r->cl != rvc_nan); 5178 1.1 mrg 5179 1.1 mrg if (r->cl == rvc_zero) 5180 1.1 mrg return true; 5181 1.1 mrg 5182 1.1 mrg /* For (-1,1), number is even. */ 5183 1.1 mrg if (REAL_EXP (r) <= 0) 5184 1.1 mrg return true; 5185 1.1 mrg 5186 1.1 mrg /* Check lowest bit, if not set, return true. */ 5187 1.1 mrg else if (REAL_EXP (r) <= SIGNIFICAND_BITS) 5188 1.1 mrg { 5189 1.1 mrg unsigned int n = SIGNIFICAND_BITS - REAL_EXP (r); 5190 1.1 mrg int w = n / HOST_BITS_PER_LONG; 5191 1.1 mrg 5192 1.1 mrg unsigned long num = ((unsigned long)1 << (n % HOST_BITS_PER_LONG)); 5193 1.1 mrg 5194 1.1 mrg if ((r->sig[w] & num) == 0) 5195 1.1 mrg return true; 5196 1.1 mrg } 5197 1.1 mrg else 5198 1.1 mrg return true; 5199 1.1 mrg 5200 1.1 mrg return false; 5201 1.1 mrg } 5202 1.1 mrg 5203 1.1 mrg /* Return true if R is halfway between two integers, else return 5204 1.1 mrg false. */ 5205 1.1 mrg 5206 1.1 mrg static bool 5207 1.1 mrg is_halfway_below (const REAL_VALUE_TYPE *r) 5208 1.1 mrg { 5209 1.1 mrg if (r->cl != rvc_normal) 5210 1.1 mrg return false; 5211 1.1 mrg 5212 1.1 mrg /* For numbers (-0.5,0) and (0,0.5). */ 5213 1.1 mrg if (REAL_EXP (r) < 0) 5214 1.1 mrg return false; 5215 1.1 mrg 5216 1.1 mrg else if (REAL_EXP (r) < SIGNIFICAND_BITS) 5217 1.1 mrg { 5218 1.1 mrg unsigned int n = SIGNIFICAND_BITS - REAL_EXP (r) - 1; 5219 1.1 mrg int w = n / HOST_BITS_PER_LONG; 5220 1.1 mrg 5221 1.1 mrg for (int i = 0; i < w; ++i) 5222 1.1 mrg if (r->sig[i] != 0) 5223 1.1 mrg return false; 5224 1.1 mrg 5225 1.1 mrg unsigned long num = 1UL << (n % HOST_BITS_PER_LONG); 5226 1.1 mrg 5227 1.1 mrg if ((r->sig[w] & num) != 0 && (r->sig[w] & (num - 1)) == 0) 5228 1.1 mrg return true; 5229 1.1 mrg } 5230 1.1 mrg return false; 5231 1.1 mrg } 5232 1.1 mrg 5233 1.1 mrg /* Round X to nearest integer, rounding halfway cases towards even. */ 5234 1.1 mrg 5235 1.1 mrg void 5236 1.1 mrg real_roundeven (REAL_VALUE_TYPE *r, format_helper fmt, 5237 1.1 mrg const REAL_VALUE_TYPE *x) 5238 1.1 mrg { 5239 1.1 mrg if (is_halfway_below (x)) 5240 1.1 mrg { 5241 1.1 mrg /* Special case as -0.5 rounds to -0.0 and 5242 1.1 mrg similarly +0.5 rounds to +0.0. */ 5243 1.1 mrg if (REAL_EXP (x) == 0) 5244 1.1 mrg { 5245 1.1 mrg *r = *x; 5246 1.1 mrg clear_significand_below (r, SIGNIFICAND_BITS); 5247 1.1 mrg } 5248 1.1 mrg else 5249 1.1 mrg { 5250 1.1 mrg do_add (r, x, &dconsthalf, x->sign); 5251 1.1 mrg if (!is_even (r)) 5252 1.1 mrg do_add (r, r, &dconstm1, x->sign); 5253 1.1 mrg } 5254 1.1 mrg if (fmt) 5255 1.1 mrg real_convert (r, fmt, r); 5256 1.1 mrg } 5257 1.1 mrg else 5258 1.1 mrg real_round (r, fmt, x); 5259 1.1 mrg } 5260 1.1 mrg 5261 1.1 mrg /* Set the sign of R to the sign of X. */ 5262 1.1 mrg 5263 1.1 mrg void 5264 1.1 mrg real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x) 5265 1.1 mrg { 5266 1.1 mrg r->sign = x->sign; 5267 1.1 mrg } 5268 1.1 mrg 5269 1.1 mrg /* Check whether the real constant value given is an integer. 5270 1.1 mrg Returns false for signaling NaN. */ 5271 1.1 mrg 5272 1.1 mrg bool 5273 1.1 mrg real_isinteger (const REAL_VALUE_TYPE *c, format_helper fmt) 5274 1.1 mrg { 5275 1.1 mrg REAL_VALUE_TYPE cint; 5276 1.1 mrg 5277 1.1 mrg real_trunc (&cint, fmt, c); 5278 1.1 mrg return real_identical (c, &cint); 5279 1.1 mrg } 5280 1.1 mrg 5281 1.1 mrg /* Check whether C is an integer that fits in a HOST_WIDE_INT, 5282 1.1 mrg storing it in *INT_OUT if so. */ 5283 1.1 mrg 5284 1.1 mrg bool 5285 1.1 mrg real_isinteger (const REAL_VALUE_TYPE *c, HOST_WIDE_INT *int_out) 5286 1.1 mrg { 5287 1.1 mrg REAL_VALUE_TYPE cint; 5288 1.1 mrg 5289 1.1 mrg HOST_WIDE_INT n = real_to_integer (c); 5290 1.1 mrg real_from_integer (&cint, VOIDmode, n, SIGNED); 5291 1.1 mrg if (real_identical (c, &cint)) 5292 1.1 mrg { 5293 1.1 mrg *int_out = n; 5294 1.1 mrg return true; 5295 1.1 mrg } 5296 1.1 mrg return false; 5297 1.1 mrg } 5298 1.1 mrg 5299 1.1 mrg /* Calculate nextafter (X, Y) or nexttoward (X, Y). Return true if 5300 1.1 mrg underflow or overflow needs to be raised. */ 5301 1.1 mrg 5302 1.1 mrg bool 5303 1.1 mrg real_nextafter (REAL_VALUE_TYPE *r, format_helper fmt, 5304 1.1 mrg const REAL_VALUE_TYPE *x, const REAL_VALUE_TYPE *y) 5305 1.1 mrg { 5306 1.1 mrg int cmp = do_compare (x, y, 2); 5307 1.1 mrg /* If either operand is NaN, return qNaN. */ 5308 1.1 mrg if (cmp == 2) 5309 1.1 mrg { 5310 1.1 mrg get_canonical_qnan (r, 0); 5311 1.1 mrg return false; 5312 1.1 mrg } 5313 1.1 mrg /* If x == y, return y cast to target type. */ 5314 1.1 mrg if (cmp == 0) 5315 1.1 mrg { 5316 1.1 mrg real_convert (r, fmt, y); 5317 1.1 mrg return false; 5318 1.1 mrg } 5319 1.1 mrg 5320 1.1 mrg if (x->cl == rvc_zero) 5321 1.1 mrg { 5322 1.1 mrg get_zero (r, y->sign); 5323 1.1 mrg r->cl = rvc_normal; 5324 1.1 mrg SET_REAL_EXP (r, fmt->emin - fmt->p + 1); 5325 1.1 mrg r->sig[SIGSZ - 1] = SIG_MSB; 5326 1.1 mrg return false; 5327 1.1 mrg } 5328 1.1 mrg 5329 1.1 mrg int np2 = SIGNIFICAND_BITS - fmt->p; 5330 1.1 mrg /* For denormals adjust np2 correspondingly. */ 5331 1.1 mrg if (x->cl == rvc_normal && REAL_EXP (x) < fmt->emin) 5332 1.1 mrg np2 += fmt->emin - REAL_EXP (x); 5333 1.1 mrg 5334 1.1 mrg REAL_VALUE_TYPE u; 5335 1.1 mrg get_zero (r, x->sign); 5336 1.1 mrg get_zero (&u, 0); 5337 1.1 mrg set_significand_bit (&u, np2); 5338 1.1 mrg r->cl = rvc_normal; 5339 1.1 mrg SET_REAL_EXP (r, REAL_EXP (x)); 5340 1.1 mrg 5341 1.1 mrg if (x->cl == rvc_inf) 5342 1.1 mrg { 5343 1.1 mrg bool borrow = sub_significands (r, r, &u, 0); 5344 1.1 mrg gcc_assert (borrow); 5345 1.1 mrg SET_REAL_EXP (r, fmt->emax); 5346 1.1 mrg } 5347 1.1 mrg else if (cmp == (x->sign ? 1 : -1)) 5348 1.1 mrg { 5349 1.1 mrg if (add_significands (r, x, &u)) 5350 1.1 mrg { 5351 1.1 mrg /* Overflow. Means the significand had been all ones, and 5352 1.1 mrg is now all zeros. Need to increase the exponent, and 5353 1.1 mrg possibly re-normalize it. */ 5354 1.1 mrg SET_REAL_EXP (r, REAL_EXP (r) + 1); 5355 1.1 mrg if (REAL_EXP (r) > fmt->emax) 5356 1.1 mrg { 5357 1.1 mrg get_inf (r, x->sign); 5358 1.1 mrg return true; 5359 1.1 mrg } 5360 1.1 mrg r->sig[SIGSZ - 1] = SIG_MSB; 5361 1.1 mrg } 5362 1.1 mrg } 5363 1.1 mrg else 5364 1.1 mrg { 5365 1.1 mrg if (REAL_EXP (x) > fmt->emin && x->sig[SIGSZ - 1] == SIG_MSB) 5366 1.1 mrg { 5367 1.1 mrg int i; 5368 1.1 mrg for (i = SIGSZ - 2; i >= 0; i--) 5369 1.1 mrg if (x->sig[i]) 5370 1.1 mrg break; 5371 1.1 mrg if (i < 0) 5372 1.1 mrg { 5373 1.1 mrg /* When mantissa is 1.0, we need to subtract only 5374 1.1 mrg half of u: nextafter (1.0, 0.0) is 1.0 - __DBL_EPSILON__ / 2 5375 1.1 mrg rather than 1.0 - __DBL_EPSILON__. */ 5376 1.1 mrg clear_significand_bit (&u, np2); 5377 1.1 mrg np2--; 5378 1.1 mrg set_significand_bit (&u, np2); 5379 1.1 mrg } 5380 1.1 mrg } 5381 1.1 mrg sub_significands (r, x, &u, 0); 5382 1.1 mrg } 5383 1.1 mrg 5384 1.1 mrg /* Clear out trailing garbage. */ 5385 1.1 mrg clear_significand_below (r, np2); 5386 1.1 mrg normalize (r); 5387 1.1 mrg if (REAL_EXP (r) <= fmt->emin - fmt->p) 5388 1.1 mrg { 5389 1.1 mrg get_zero (r, x->sign); 5390 1.1 mrg return true; 5391 1.1 mrg } 5392 1.1 mrg return r->cl == rvc_zero || REAL_EXP (r) < fmt->emin; 5393 1.1 mrg } 5394 1.1 mrg 5395 1.1 mrg /* Write into BUF the maximum representable finite floating-point 5396 1.1 mrg number, (1 - b**-p) * b**emax for a given FP format FMT as a hex 5397 1.1 mrg float string. LEN is the size of BUF, and the buffer must be large 5398 1.1 mrg enough to contain the resulting string. If NORM_MAX, instead write 5399 1.1 mrg the maximum representable finite normalized floating-point number, 5400 1.1 mrg defined to be such that all choices of digits for that exponent are 5401 1.1 mrg representable in the format (this only makes a difference for IBM 5402 1.1 mrg long double). */ 5403 1.1 mrg 5404 1.1 mrg void 5405 1.1 mrg get_max_float (const struct real_format *fmt, char *buf, size_t len, 5406 1.1 mrg bool norm_max) 5407 1.1 mrg { 5408 1.1 mrg if (fmt->b == 10) 5409 1.1 mrg { 5410 1.1 mrg char *p = buf; 5411 1.1 mrg for (int i = fmt->p; i; i--) 5412 1.1 mrg { 5413 1.1 mrg *p++ = '9'; 5414 1.1 mrg if (i == fmt->p) 5415 1.1 mrg *p++ = '.'; 5416 1.1 mrg } 5417 1.1 mrg /* fmt->p plus 1, to account for the decimal point and fmt->emax 5418 1.1 mrg minus 1 because the digits are nines, not 1.0. */ 5419 1.1 mrg sprintf (buf + fmt->p + 1, "E%d", fmt->emax - 1); 5420 1.1 mrg gcc_assert (strlen (buf) < len); 5421 1.1 mrg return; 5422 1.1 mrg } 5423 1.1 mrg 5424 1.1 mrg int i, n; 5425 1.1 mrg char *p; 5426 1.1 mrg bool is_ibm_extended = fmt->pnan < fmt->p; 5427 1.1 mrg 5428 1.1 mrg strcpy (buf, "0x0."); 5429 1.1 mrg n = fmt->p; 5430 1.1 mrg for (i = 0, p = buf + 4; i + 3 < n; i += 4) 5431 1.1 mrg *p++ = 'f'; 5432 1.1 mrg if (i < n) 5433 1.1 mrg *p++ = "08ce"[n - i]; 5434 1.1 mrg sprintf (p, "p%d", 5435 1.1 mrg (is_ibm_extended && norm_max) ? fmt->emax - 1 : fmt->emax); 5436 1.1 mrg if (is_ibm_extended && !norm_max) 5437 1.1 mrg { 5438 1.1 mrg /* This is an IBM extended double format made up of two IEEE 5439 1.1 mrg doubles. The value of the long double is the sum of the 5440 1.1 mrg values of the two parts. The most significant part is 5441 1.1 mrg required to be the value of the long double rounded to the 5442 1.1 mrg nearest double. Rounding means we need a slightly smaller 5443 1.1 mrg value for LDBL_MAX. */ 5444 1.1 mrg buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4]; 5445 1.1 mrg } 5446 1.1 mrg 5447 1.1 mrg gcc_assert (strlen (buf) < len); 5448 1.1 mrg } 5449 1.1 mrg 5450 1.1 mrg /* True if all values of integral type can be represented 5451 1.1 mrg by this floating-point type exactly. */ 5452 1.1 mrg 5453 1.1 mrg bool format_helper::can_represent_integral_type_p (tree type) const 5454 1.1 mrg { 5455 1.1 mrg gcc_assert (! decimal_p () && INTEGRAL_TYPE_P (type)); 5456 1.1 mrg 5457 1.1 mrg /* INT?_MIN is power-of-two so it takes 5458 1.1 mrg only one mantissa bit. */ 5459 1.1 mrg bool signed_p = TYPE_SIGN (type) == SIGNED; 5460 1.1 mrg return TYPE_PRECISION (type) - signed_p <= significand_size (*this); 5461 1.1 mrg } 5462 1.1 mrg 5463 1.1 mrg /* True if mode M has a NaN representation and 5464 1.1 mrg the treatment of NaN operands is important. */ 5465 1.1 mrg 5466 1.1 mrg bool 5467 1.1 mrg HONOR_NANS (machine_mode m) 5468 1.1 mrg { 5469 1.1 mrg return MODE_HAS_NANS (m) && !flag_finite_math_only; 5470 1.1 mrg } 5471 1.1 mrg 5472 1.1 mrg bool 5473 1.1 mrg HONOR_NANS (const_tree t) 5474 1.1 mrg { 5475 1.1 mrg return HONOR_NANS (element_mode (t)); 5476 1.1 mrg } 5477 1.1 mrg 5478 1.1 mrg bool 5479 1.1 mrg HONOR_NANS (const_rtx x) 5480 1.1 mrg { 5481 1.1 mrg return HONOR_NANS (GET_MODE (x)); 5482 1.1 mrg } 5483 1.1 mrg 5484 1.1 mrg /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs). */ 5485 1.1 mrg 5486 1.1 mrg bool 5487 1.1 mrg HONOR_SNANS (machine_mode m) 5488 1.1 mrg { 5489 1.1 mrg return flag_signaling_nans && HONOR_NANS (m); 5490 1.1 mrg } 5491 1.1 mrg 5492 1.1 mrg bool 5493 1.1 mrg HONOR_SNANS (const_tree t) 5494 1.1 mrg { 5495 1.1 mrg return HONOR_SNANS (element_mode (t)); 5496 1.1 mrg } 5497 1.1 mrg 5498 1.1 mrg bool 5499 1.1 mrg HONOR_SNANS (const_rtx x) 5500 1.1 mrg { 5501 1.1 mrg return HONOR_SNANS (GET_MODE (x)); 5502 1.1 mrg } 5503 1.1 mrg 5504 1.1 mrg /* As for HONOR_NANS, but true if the mode can represent infinity and 5505 1.1 mrg the treatment of infinite values is important. */ 5506 1.1 mrg 5507 1.1 mrg bool 5508 1.1 mrg HONOR_INFINITIES (machine_mode m) 5509 1.1 mrg { 5510 1.1 mrg return MODE_HAS_INFINITIES (m) && !flag_finite_math_only; 5511 1.1 mrg } 5512 1.1 mrg 5513 1.1 mrg bool 5514 1.1 mrg HONOR_INFINITIES (const_tree t) 5515 1.1 mrg { 5516 1.1 mrg return HONOR_INFINITIES (element_mode (t)); 5517 1.1 mrg } 5518 1.1 mrg 5519 1.1 mrg bool 5520 1.1 mrg HONOR_INFINITIES (const_rtx x) 5521 1.1 mrg { 5522 1.1 mrg return HONOR_INFINITIES (GET_MODE (x)); 5523 1.1 mrg } 5524 1.1 mrg 5525 1.1 mrg /* Like HONOR_NANS, but true if the given mode distinguishes between 5526 1.1 mrg positive and negative zero, and the sign of zero is important. */ 5527 1.1 mrg 5528 1.1 mrg bool 5529 1.1 mrg HONOR_SIGNED_ZEROS (machine_mode m) 5530 1.1 mrg { 5531 1.1 mrg return MODE_HAS_SIGNED_ZEROS (m) && flag_signed_zeros; 5532 1.1 mrg } 5533 1.1 mrg 5534 1.1 mrg bool 5535 1.1 mrg HONOR_SIGNED_ZEROS (const_tree t) 5536 1.1 mrg { 5537 1.1 mrg return HONOR_SIGNED_ZEROS (element_mode (t)); 5538 1.1 mrg } 5539 1.1 mrg 5540 1.1 mrg bool 5541 1.1 mrg HONOR_SIGNED_ZEROS (const_rtx x) 5542 1.1 mrg { 5543 1.1 mrg return HONOR_SIGNED_ZEROS (GET_MODE (x)); 5544 1.1 mrg } 5545 1.1 mrg 5546 1.1 mrg /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding, 5547 1.1 mrg and the rounding mode is important. */ 5548 1.1 mrg 5549 1.1 mrg bool 5550 1.1 mrg HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m) 5551 1.1 mrg { 5552 1.1 mrg return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m) && flag_rounding_math; 5553 1.1 mrg } 5554 1.1 mrg 5555 1.1 mrg bool 5556 1.1 mrg HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t) 5557 1.1 mrg { 5558 1.1 mrg return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t)); 5559 1.1 mrg } 5560 1.1 mrg 5561 1.1 mrg bool 5562 1.1 mrg HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x) 5563 1.1 mrg { 5564 1.1 mrg return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x)); 5565 1.1 mrg } 5566 1.1 mrg 5567 1.1 mrg /* Fills r with the largest value such that 1 + r*r won't overflow. 5568 1.1 mrg This is used in both sin (atan (x)) and cos (atan(x)) optimizations. */ 5569 1.1 mrg 5570 1.1 mrg void 5571 1.1 mrg build_sinatan_real (REAL_VALUE_TYPE * r, tree type) 5572 1.1 mrg { 5573 1.1 mrg REAL_VALUE_TYPE maxval; 5574 1.1 mrg mpfr_t mpfr_const1, mpfr_c, mpfr_maxval; 5575 1.1 mrg machine_mode mode = TYPE_MODE (type); 5576 1.1 mrg const struct real_format * fmt = REAL_MODE_FORMAT (mode); 5577 5578 real_maxval (&maxval, 0, mode); 5579 5580 mpfr_inits (mpfr_const1, mpfr_c, mpfr_maxval, NULL); 5581 5582 mpfr_from_real (mpfr_const1, &dconst1, MPFR_RNDN); 5583 mpfr_from_real (mpfr_maxval, &maxval, MPFR_RNDN); 5584 5585 mpfr_sub (mpfr_c, mpfr_maxval, mpfr_const1, MPFR_RNDN); 5586 mpfr_sqrt (mpfr_c, mpfr_c, MPFR_RNDZ); 5587 5588 real_from_mpfr (r, mpfr_c, fmt, MPFR_RNDZ); 5589 5590 mpfr_clears (mpfr_const1, mpfr_c, mpfr_maxval, NULL); 5591 } 5592