1 /* 2 * QEMU float support 3 * 4 * The code in this source file is derived from release 2a of the SoftFloat 5 * IEC/IEEE Floating-point Arithmetic Package. Those parts of the code (and 6 * some later contributions) are provided under that license, as detailed below. 7 * It has subsequently been modified by contributors to the QEMU Project, 8 * so some portions are provided under: 9 * the SoftFloat-2a license 10 * the BSD license 11 * GPL-v2-or-later 12 * 13 * Any future contributions to this file after December 1st 2014 will be 14 * taken to be licensed under the Softfloat-2a license unless specifically 15 * indicated otherwise. 16 */ 17 18 /* 19 =============================================================================== 20 This C source file is part of the SoftFloat IEC/IEEE Floating-point 21 Arithmetic Package, Release 2a. 22 23 Written by John R. Hauser. This work was made possible in part by the 24 International Computer Science Institute, located at Suite 600, 1947 Center 25 Street, Berkeley, California 94704. Funding was partially provided by the 26 National Science Foundation under grant MIP-9311980. The original version 27 of this code was written as part of a project to build a fixed-point vector 28 processor in collaboration with the University of California at Berkeley, 29 overseen by Profs. Nelson Morgan and John Wawrzynek. More information 30 is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 31 arithmetic/SoftFloat.html'. 32 33 THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 34 has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 35 TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 36 PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 37 AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 38 39 Derivative works are acceptable, even for commercial purposes, so long as 40 (1) they include prominent notice that the work is derivative, and (2) they 41 include prominent notice akin to these four paragraphs for those parts of 42 this code that are retained. 43 44 =============================================================================== 45 */ 46 47 /* BSD licensing: 48 * Copyright (c) 2006, Fabrice Bellard 49 * All rights reserved. 50 * 51 * Redistribution and use in source and binary forms, with or without 52 * modification, are permitted provided that the following conditions are met: 53 * 54 * 1. Redistributions of source code must retain the above copyright notice, 55 * this list of conditions and the following disclaimer. 56 * 57 * 2. Redistributions in binary form must reproduce the above copyright notice, 58 * this list of conditions and the following disclaimer in the documentation 59 * and/or other materials provided with the distribution. 60 * 61 * 3. Neither the name of the copyright holder nor the names of its contributors 62 * may be used to endorse or promote products derived from this software without 63 * specific prior written permission. 64 * 65 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 66 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 67 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 68 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 69 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 70 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 71 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 72 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 73 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 74 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 75 * THE POSSIBILITY OF SUCH DAMAGE. 76 */ 77 78 /* Portions of this work are licensed under the terms of the GNU GPL, 79 * version 2 or later. See the COPYING file in the top-level directory. 80 */ 81 82 /* softfloat (and in particular the code in softfloat-specialize.h) is 83 * target-dependent and needs the TARGET_* macros. 84 */ 85 #include "qemu/osdep.h" 86 #include <math.h> 87 #include "qemu/bitops.h" 88 #include "fpu/softfloat.h" 89 90 /* We only need stdlib for abort() */ 91 92 /*---------------------------------------------------------------------------- 93 | Primitive arithmetic functions, including multi-word arithmetic, and 94 | division and square root approximations. (Can be specialized to target if 95 | desired.) 96 *----------------------------------------------------------------------------*/ 97 #include "fpu/softfloat-macros.h" 98 99 /* 100 * Hardfloat 101 * 102 * Fast emulation of guest FP instructions is challenging for two reasons. 103 * First, FP instruction semantics are similar but not identical, particularly 104 * when handling NaNs. Second, emulating at reasonable speed the guest FP 105 * exception flags is not trivial: reading the host's flags register with a 106 * feclearexcept & fetestexcept pair is slow [slightly slower than soft-fp], 107 * and trapping on every FP exception is not fast nor pleasant to work with. 108 * 109 * We address these challenges by leveraging the host FPU for a subset of the 110 * operations. To do this we expand on the idea presented in this paper: 111 * 112 * Guo, Yu-Chuan, et al. "Translating the ARM Neon and VFP instructions in a 113 * binary translator." Software: Practice and Experience 46.12 (2016):1591-1615. 114 * 115 * The idea is thus to leverage the host FPU to (1) compute FP operations 116 * and (2) identify whether FP exceptions occurred while avoiding 117 * expensive exception flag register accesses. 118 * 119 * An important optimization shown in the paper is that given that exception 120 * flags are rarely cleared by the guest, we can avoid recomputing some flags. 121 * This is particularly useful for the inexact flag, which is very frequently 122 * raised in floating-point workloads. 123 * 124 * We optimize the code further by deferring to soft-fp whenever FP exception 125 * detection might get hairy. Two examples: (1) when at least one operand is 126 * denormal/inf/NaN; (2) when operands are not guaranteed to lead to a 0 result 127 * and the result is < the minimum normal. 128 */ 129 #define GEN_INPUT_FLUSH__NOCHECK(name, soft_t) \ 130 static inline void name(soft_t *a, float_status *s) \ 131 { \ 132 if (unlikely(soft_t ## _is_denormal(*a))) { \ 133 *a = soft_t ## _set_sign(soft_t ## _zero, \ 134 soft_t ## _is_neg(*a)); \ 135 float_raise(float_flag_input_denormal, s); \ 136 } \ 137 } 138 139 GEN_INPUT_FLUSH__NOCHECK(float32_input_flush__nocheck, float32) 140 GEN_INPUT_FLUSH__NOCHECK(float64_input_flush__nocheck, float64) 141 #undef GEN_INPUT_FLUSH__NOCHECK 142 143 #define GEN_INPUT_FLUSH1(name, soft_t) \ 144 static inline void name(soft_t *a, float_status *s) \ 145 { \ 146 if (likely(!s->flush_inputs_to_zero)) { \ 147 return; \ 148 } \ 149 soft_t ## _input_flush__nocheck(a, s); \ 150 } 151 152 GEN_INPUT_FLUSH1(float32_input_flush1, float32) 153 GEN_INPUT_FLUSH1(float64_input_flush1, float64) 154 #undef GEN_INPUT_FLUSH1 155 156 #define GEN_INPUT_FLUSH2(name, soft_t) \ 157 static inline void name(soft_t *a, soft_t *b, float_status *s) \ 158 { \ 159 if (likely(!s->flush_inputs_to_zero)) { \ 160 return; \ 161 } \ 162 soft_t ## _input_flush__nocheck(a, s); \ 163 soft_t ## _input_flush__nocheck(b, s); \ 164 } 165 166 GEN_INPUT_FLUSH2(float32_input_flush2, float32) 167 GEN_INPUT_FLUSH2(float64_input_flush2, float64) 168 #undef GEN_INPUT_FLUSH2 169 170 #define GEN_INPUT_FLUSH3(name, soft_t) \ 171 static inline void name(soft_t *a, soft_t *b, soft_t *c, float_status *s) \ 172 { \ 173 if (likely(!s->flush_inputs_to_zero)) { \ 174 return; \ 175 } \ 176 soft_t ## _input_flush__nocheck(a, s); \ 177 soft_t ## _input_flush__nocheck(b, s); \ 178 soft_t ## _input_flush__nocheck(c, s); \ 179 } 180 181 GEN_INPUT_FLUSH3(float32_input_flush3, float32) 182 GEN_INPUT_FLUSH3(float64_input_flush3, float64) 183 #undef GEN_INPUT_FLUSH3 184 185 /* 186 * Choose whether to use fpclassify or float32/64_* primitives in the generated 187 * hardfloat functions. Each combination of number of inputs and float size 188 * gets its own value. 189 */ 190 #if defined(__x86_64__) 191 # define QEMU_HARDFLOAT_1F32_USE_FP 0 192 # define QEMU_HARDFLOAT_1F64_USE_FP 1 193 # define QEMU_HARDFLOAT_2F32_USE_FP 0 194 # define QEMU_HARDFLOAT_2F64_USE_FP 1 195 # define QEMU_HARDFLOAT_3F32_USE_FP 0 196 # define QEMU_HARDFLOAT_3F64_USE_FP 1 197 #else 198 # define QEMU_HARDFLOAT_1F32_USE_FP 0 199 # define QEMU_HARDFLOAT_1F64_USE_FP 0 200 # define QEMU_HARDFLOAT_2F32_USE_FP 0 201 # define QEMU_HARDFLOAT_2F64_USE_FP 0 202 # define QEMU_HARDFLOAT_3F32_USE_FP 0 203 # define QEMU_HARDFLOAT_3F64_USE_FP 0 204 #endif 205 206 /* 207 * QEMU_HARDFLOAT_USE_ISINF chooses whether to use isinf() over 208 * float{32,64}_is_infinity when !USE_FP. 209 * On x86_64/aarch64, using the former over the latter can yield a ~6% speedup. 210 * On power64 however, using isinf() reduces fp-bench performance by up to 50%. 211 */ 212 #if defined(__x86_64__) || defined(__aarch64__) 213 # define QEMU_HARDFLOAT_USE_ISINF 1 214 #else 215 # define QEMU_HARDFLOAT_USE_ISINF 0 216 #endif 217 218 /* 219 * Some targets clear the FP flags before most FP operations. This prevents 220 * the use of hardfloat, since hardfloat relies on the inexact flag being 221 * already set. 222 */ 223 #if defined(TARGET_PPC) || defined(__FAST_MATH__) 224 # if defined(__FAST_MATH__) 225 # warning disabling hardfloat due to -ffast-math: hardfloat requires an exact \ 226 IEEE implementation 227 # endif 228 # define QEMU_NO_HARDFLOAT 1 229 # define QEMU_SOFTFLOAT_ATTR QEMU_FLATTEN 230 #else 231 # define QEMU_NO_HARDFLOAT 0 232 # define QEMU_SOFTFLOAT_ATTR QEMU_FLATTEN __attribute__((noinline)) 233 #endif 234 235 static inline bool can_use_fpu(const float_status *s) 236 { 237 if (QEMU_NO_HARDFLOAT) { 238 return false; 239 } 240 return likely(s->float_exception_flags & float_flag_inexact && 241 s->float_rounding_mode == float_round_nearest_even); 242 } 243 244 /* 245 * Hardfloat generation functions. Each operation can have two flavors: 246 * either using softfloat primitives (e.g. float32_is_zero_or_normal) for 247 * most condition checks, or native ones (e.g. fpclassify). 248 * 249 * The flavor is chosen by the callers. Instead of using macros, we rely on the 250 * compiler to propagate constants and inline everything into the callers. 251 * 252 * We only generate functions for operations with two inputs, since only 253 * these are common enough to justify consolidating them into common code. 254 */ 255 256 typedef union { 257 float32 s; 258 float h; 259 } union_float32; 260 261 typedef union { 262 float64 s; 263 double h; 264 } union_float64; 265 266 typedef bool (*f32_check_fn)(union_float32 a, union_float32 b); 267 typedef bool (*f64_check_fn)(union_float64 a, union_float64 b); 268 269 typedef float32 (*soft_f32_op2_fn)(float32 a, float32 b, float_status *s); 270 typedef float64 (*soft_f64_op2_fn)(float64 a, float64 b, float_status *s); 271 typedef float (*hard_f32_op2_fn)(float a, float b); 272 typedef double (*hard_f64_op2_fn)(double a, double b); 273 274 /* 2-input is-zero-or-normal */ 275 static inline bool f32_is_zon2(union_float32 a, union_float32 b) 276 { 277 if (QEMU_HARDFLOAT_2F32_USE_FP) { 278 /* 279 * Not using a temp variable for consecutive fpclassify calls ends up 280 * generating faster code. 281 */ 282 return (fpclassify(a.h) == FP_NORMAL || fpclassify(a.h) == FP_ZERO) && 283 (fpclassify(b.h) == FP_NORMAL || fpclassify(b.h) == FP_ZERO); 284 } 285 return float32_is_zero_or_normal(a.s) && 286 float32_is_zero_or_normal(b.s); 287 } 288 289 static inline bool f64_is_zon2(union_float64 a, union_float64 b) 290 { 291 if (QEMU_HARDFLOAT_2F64_USE_FP) { 292 return (fpclassify(a.h) == FP_NORMAL || fpclassify(a.h) == FP_ZERO) && 293 (fpclassify(b.h) == FP_NORMAL || fpclassify(b.h) == FP_ZERO); 294 } 295 return float64_is_zero_or_normal(a.s) && 296 float64_is_zero_or_normal(b.s); 297 } 298 299 /* 3-input is-zero-or-normal */ 300 static inline 301 bool f32_is_zon3(union_float32 a, union_float32 b, union_float32 c) 302 { 303 if (QEMU_HARDFLOAT_3F32_USE_FP) { 304 return (fpclassify(a.h) == FP_NORMAL || fpclassify(a.h) == FP_ZERO) && 305 (fpclassify(b.h) == FP_NORMAL || fpclassify(b.h) == FP_ZERO) && 306 (fpclassify(c.h) == FP_NORMAL || fpclassify(c.h) == FP_ZERO); 307 } 308 return float32_is_zero_or_normal(a.s) && 309 float32_is_zero_or_normal(b.s) && 310 float32_is_zero_or_normal(c.s); 311 } 312 313 static inline 314 bool f64_is_zon3(union_float64 a, union_float64 b, union_float64 c) 315 { 316 if (QEMU_HARDFLOAT_3F64_USE_FP) { 317 return (fpclassify(a.h) == FP_NORMAL || fpclassify(a.h) == FP_ZERO) && 318 (fpclassify(b.h) == FP_NORMAL || fpclassify(b.h) == FP_ZERO) && 319 (fpclassify(c.h) == FP_NORMAL || fpclassify(c.h) == FP_ZERO); 320 } 321 return float64_is_zero_or_normal(a.s) && 322 float64_is_zero_or_normal(b.s) && 323 float64_is_zero_or_normal(c.s); 324 } 325 326 static inline bool f32_is_inf(union_float32 a) 327 { 328 if (QEMU_HARDFLOAT_USE_ISINF) { 329 return isinf(a.h); 330 } 331 return float32_is_infinity(a.s); 332 } 333 334 static inline bool f64_is_inf(union_float64 a) 335 { 336 if (QEMU_HARDFLOAT_USE_ISINF) { 337 return isinf(a.h); 338 } 339 return float64_is_infinity(a.s); 340 } 341 342 static inline float32 343 float32_gen2(float32 xa, float32 xb, float_status *s, 344 hard_f32_op2_fn hard, soft_f32_op2_fn soft, 345 f32_check_fn pre, f32_check_fn post) 346 { 347 union_float32 ua, ub, ur; 348 349 ua.s = xa; 350 ub.s = xb; 351 352 if (unlikely(!can_use_fpu(s))) { 353 goto soft; 354 } 355 356 float32_input_flush2(&ua.s, &ub.s, s); 357 if (unlikely(!pre(ua, ub))) { 358 goto soft; 359 } 360 361 ur.h = hard(ua.h, ub.h); 362 if (unlikely(f32_is_inf(ur))) { 363 float_raise(float_flag_overflow, s); 364 } else if (unlikely(fabsf(ur.h) <= FLT_MIN) && post(ua, ub)) { 365 goto soft; 366 } 367 return ur.s; 368 369 soft: 370 return soft(ua.s, ub.s, s); 371 } 372 373 static inline float64 374 float64_gen2(float64 xa, float64 xb, float_status *s, 375 hard_f64_op2_fn hard, soft_f64_op2_fn soft, 376 f64_check_fn pre, f64_check_fn post) 377 { 378 union_float64 ua, ub, ur; 379 380 ua.s = xa; 381 ub.s = xb; 382 383 if (unlikely(!can_use_fpu(s))) { 384 goto soft; 385 } 386 387 float64_input_flush2(&ua.s, &ub.s, s); 388 if (unlikely(!pre(ua, ub))) { 389 goto soft; 390 } 391 392 ur.h = hard(ua.h, ub.h); 393 if (unlikely(f64_is_inf(ur))) { 394 float_raise(float_flag_overflow, s); 395 } else if (unlikely(fabs(ur.h) <= DBL_MIN) && post(ua, ub)) { 396 goto soft; 397 } 398 return ur.s; 399 400 soft: 401 return soft(ua.s, ub.s, s); 402 } 403 404 /* 405 * Classify a floating point number. Everything above float_class_qnan 406 * is a NaN so cls >= float_class_qnan is any NaN. 407 */ 408 409 typedef enum __attribute__ ((__packed__)) { 410 float_class_unclassified, 411 float_class_zero, 412 float_class_normal, 413 float_class_inf, 414 float_class_qnan, /* all NaNs from here */ 415 float_class_snan, 416 } FloatClass; 417 418 #define float_cmask(bit) (1u << (bit)) 419 420 enum { 421 float_cmask_zero = float_cmask(float_class_zero), 422 float_cmask_normal = float_cmask(float_class_normal), 423 float_cmask_inf = float_cmask(float_class_inf), 424 float_cmask_qnan = float_cmask(float_class_qnan), 425 float_cmask_snan = float_cmask(float_class_snan), 426 427 float_cmask_infzero = float_cmask_zero | float_cmask_inf, 428 float_cmask_anynan = float_cmask_qnan | float_cmask_snan, 429 }; 430 431 /* Flags for parts_minmax. */ 432 enum { 433 /* Set for minimum; clear for maximum. */ 434 minmax_ismin = 1, 435 /* Set for the IEEE 754-2008 minNum() and maxNum() operations. */ 436 minmax_isnum = 2, 437 /* Set for the IEEE 754-2008 minNumMag() and minNumMag() operations. */ 438 minmax_ismag = 4, 439 /* 440 * Set for the IEEE 754-2019 minimumNumber() and maximumNumber() 441 * operations. 442 */ 443 minmax_isnumber = 8, 444 }; 445 446 /* Simple helpers for checking if, or what kind of, NaN we have */ 447 static inline __attribute__((unused)) bool is_nan(FloatClass c) 448 { 449 return unlikely(c >= float_class_qnan); 450 } 451 452 static inline __attribute__((unused)) bool is_snan(FloatClass c) 453 { 454 return c == float_class_snan; 455 } 456 457 static inline __attribute__((unused)) bool is_qnan(FloatClass c) 458 { 459 return c == float_class_qnan; 460 } 461 462 /* 463 * Structure holding all of the decomposed parts of a float. 464 * The exponent is unbiased and the fraction is normalized. 465 * 466 * The fraction words are stored in big-endian word ordering, 467 * so that truncation from a larger format to a smaller format 468 * can be done simply by ignoring subsequent elements. 469 */ 470 471 typedef struct { 472 FloatClass cls; 473 bool sign; 474 int32_t exp; 475 union { 476 /* Routines that know the structure may reference the singular name. */ 477 uint64_t frac; 478 /* 479 * Routines expanded with multiple structures reference "hi" and "lo" 480 * depending on the operation. In FloatParts64, "hi" and "lo" are 481 * both the same word and aliased here. 482 */ 483 uint64_t frac_hi; 484 uint64_t frac_lo; 485 }; 486 } FloatParts64; 487 488 typedef struct { 489 FloatClass cls; 490 bool sign; 491 int32_t exp; 492 uint64_t frac_hi; 493 uint64_t frac_lo; 494 } FloatParts128; 495 496 typedef struct { 497 FloatClass cls; 498 bool sign; 499 int32_t exp; 500 uint64_t frac_hi; 501 uint64_t frac_hm; /* high-middle */ 502 uint64_t frac_lm; /* low-middle */ 503 uint64_t frac_lo; 504 } FloatParts256; 505 506 /* These apply to the most significant word of each FloatPartsN. */ 507 #define DECOMPOSED_BINARY_POINT 63 508 #define DECOMPOSED_IMPLICIT_BIT (1ull << DECOMPOSED_BINARY_POINT) 509 510 /* Structure holding all of the relevant parameters for a format. 511 * exp_size: the size of the exponent field 512 * exp_bias: the offset applied to the exponent field 513 * exp_max: the maximum normalised exponent 514 * frac_size: the size of the fraction field 515 * frac_shift: shift to normalise the fraction with DECOMPOSED_BINARY_POINT 516 * The following are computed based the size of fraction 517 * round_mask: bits below lsb which must be rounded 518 * The following optional modifiers are available: 519 * arm_althp: handle ARM Alternative Half Precision 520 */ 521 typedef struct { 522 int exp_size; 523 int exp_bias; 524 int exp_re_bias; 525 int exp_max; 526 int frac_size; 527 int frac_shift; 528 bool arm_althp; 529 uint64_t round_mask; 530 } FloatFmt; 531 532 /* Expand fields based on the size of exponent and fraction */ 533 #define FLOAT_PARAMS_(E) \ 534 .exp_size = E, \ 535 .exp_bias = ((1 << E) - 1) >> 1, \ 536 .exp_re_bias = (1 << (E - 1)) + (1 << (E - 2)), \ 537 .exp_max = (1 << E) - 1 538 539 #define FLOAT_PARAMS(E, F) \ 540 FLOAT_PARAMS_(E), \ 541 .frac_size = F, \ 542 .frac_shift = (-F - 1) & 63, \ 543 .round_mask = (1ull << ((-F - 1) & 63)) - 1 544 545 static const FloatFmt float16_params = { 546 FLOAT_PARAMS(5, 10) 547 }; 548 549 static const FloatFmt float16_params_ahp = { 550 FLOAT_PARAMS(5, 10), 551 .arm_althp = true 552 }; 553 554 static const FloatFmt bfloat16_params = { 555 FLOAT_PARAMS(8, 7) 556 }; 557 558 static const FloatFmt float32_params = { 559 FLOAT_PARAMS(8, 23) 560 }; 561 562 static const FloatFmt float64_params = { 563 FLOAT_PARAMS(11, 52) 564 }; 565 566 static const FloatFmt float128_params = { 567 FLOAT_PARAMS(15, 112) 568 }; 569 570 #define FLOATX80_PARAMS(R) \ 571 FLOAT_PARAMS_(15), \ 572 .frac_size = R == 64 ? 63 : R, \ 573 .frac_shift = 0, \ 574 .round_mask = R == 64 ? -1 : (1ull << ((-R - 1) & 63)) - 1 575 576 static const FloatFmt floatx80_params[3] = { 577 [floatx80_precision_s] = { FLOATX80_PARAMS(23) }, 578 [floatx80_precision_d] = { FLOATX80_PARAMS(52) }, 579 [floatx80_precision_x] = { FLOATX80_PARAMS(64) }, 580 }; 581 582 /* Unpack a float to parts, but do not canonicalize. */ 583 static void unpack_raw64(FloatParts64 *r, const FloatFmt *fmt, uint64_t raw) 584 { 585 const int f_size = fmt->frac_size; 586 const int e_size = fmt->exp_size; 587 588 *r = (FloatParts64) { 589 .cls = float_class_unclassified, 590 .sign = extract64(raw, f_size + e_size, 1), 591 .exp = extract64(raw, f_size, e_size), 592 .frac = extract64(raw, 0, f_size) 593 }; 594 } 595 596 static void QEMU_FLATTEN float16_unpack_raw(FloatParts64 *p, float16 f) 597 { 598 unpack_raw64(p, &float16_params, f); 599 } 600 601 static void QEMU_FLATTEN bfloat16_unpack_raw(FloatParts64 *p, bfloat16 f) 602 { 603 unpack_raw64(p, &bfloat16_params, f); 604 } 605 606 static void QEMU_FLATTEN float32_unpack_raw(FloatParts64 *p, float32 f) 607 { 608 unpack_raw64(p, &float32_params, f); 609 } 610 611 static void QEMU_FLATTEN float64_unpack_raw(FloatParts64 *p, float64 f) 612 { 613 unpack_raw64(p, &float64_params, f); 614 } 615 616 static void QEMU_FLATTEN floatx80_unpack_raw(FloatParts128 *p, floatx80 f) 617 { 618 *p = (FloatParts128) { 619 .cls = float_class_unclassified, 620 .sign = extract32(f.high, 15, 1), 621 .exp = extract32(f.high, 0, 15), 622 .frac_hi = f.low 623 }; 624 } 625 626 static void QEMU_FLATTEN float128_unpack_raw(FloatParts128 *p, float128 f) 627 { 628 const int f_size = float128_params.frac_size - 64; 629 const int e_size = float128_params.exp_size; 630 631 *p = (FloatParts128) { 632 .cls = float_class_unclassified, 633 .sign = extract64(f.high, f_size + e_size, 1), 634 .exp = extract64(f.high, f_size, e_size), 635 .frac_hi = extract64(f.high, 0, f_size), 636 .frac_lo = f.low, 637 }; 638 } 639 640 /* Pack a float from parts, but do not canonicalize. */ 641 static uint64_t pack_raw64(const FloatParts64 *p, const FloatFmt *fmt) 642 { 643 const int f_size = fmt->frac_size; 644 const int e_size = fmt->exp_size; 645 uint64_t ret; 646 647 ret = (uint64_t)p->sign << (f_size + e_size); 648 ret = deposit64(ret, f_size, e_size, p->exp); 649 ret = deposit64(ret, 0, f_size, p->frac); 650 return ret; 651 } 652 653 static float16 QEMU_FLATTEN float16_pack_raw(const FloatParts64 *p) 654 { 655 return make_float16(pack_raw64(p, &float16_params)); 656 } 657 658 static bfloat16 QEMU_FLATTEN bfloat16_pack_raw(const FloatParts64 *p) 659 { 660 return pack_raw64(p, &bfloat16_params); 661 } 662 663 static float32 QEMU_FLATTEN float32_pack_raw(const FloatParts64 *p) 664 { 665 return make_float32(pack_raw64(p, &float32_params)); 666 } 667 668 static float64 QEMU_FLATTEN float64_pack_raw(const FloatParts64 *p) 669 { 670 return make_float64(pack_raw64(p, &float64_params)); 671 } 672 673 static float128 QEMU_FLATTEN float128_pack_raw(const FloatParts128 *p) 674 { 675 const int f_size = float128_params.frac_size - 64; 676 const int e_size = float128_params.exp_size; 677 uint64_t hi; 678 679 hi = (uint64_t)p->sign << (f_size + e_size); 680 hi = deposit64(hi, f_size, e_size, p->exp); 681 hi = deposit64(hi, 0, f_size, p->frac_hi); 682 return make_float128(hi, p->frac_lo); 683 } 684 685 /*---------------------------------------------------------------------------- 686 | Functions and definitions to determine: (1) whether tininess for underflow 687 | is detected before or after rounding by default, (2) what (if anything) 688 | happens when exceptions are raised, (3) how signaling NaNs are distinguished 689 | from quiet NaNs, (4) the default generated quiet NaNs, and (5) how NaNs 690 | are propagated from function inputs to output. These details are target- 691 | specific. 692 *----------------------------------------------------------------------------*/ 693 #include "softfloat-specialize.c.inc" 694 695 #define PARTS_GENERIC_64_128(NAME, P) \ 696 _Generic((P), FloatParts64 *: parts64_##NAME, \ 697 FloatParts128 *: parts128_##NAME) 698 699 #define PARTS_GENERIC_64_128_256(NAME, P) \ 700 _Generic((P), FloatParts64 *: parts64_##NAME, \ 701 FloatParts128 *: parts128_##NAME, \ 702 FloatParts256 *: parts256_##NAME) 703 704 #define parts_default_nan(P, S) PARTS_GENERIC_64_128(default_nan, P)(P, S) 705 #define parts_silence_nan(P, S) PARTS_GENERIC_64_128(silence_nan, P)(P, S) 706 707 static void parts64_return_nan(FloatParts64 *a, float_status *s); 708 static void parts128_return_nan(FloatParts128 *a, float_status *s); 709 710 #define parts_return_nan(P, S) PARTS_GENERIC_64_128(return_nan, P)(P, S) 711 712 static FloatParts64 *parts64_pick_nan(FloatParts64 *a, FloatParts64 *b, 713 float_status *s); 714 static FloatParts128 *parts128_pick_nan(FloatParts128 *a, FloatParts128 *b, 715 float_status *s); 716 717 #define parts_pick_nan(A, B, S) PARTS_GENERIC_64_128(pick_nan, A)(A, B, S) 718 719 static FloatParts64 *parts64_pick_nan_muladd(FloatParts64 *a, FloatParts64 *b, 720 FloatParts64 *c, float_status *s, 721 int ab_mask, int abc_mask); 722 static FloatParts128 *parts128_pick_nan_muladd(FloatParts128 *a, 723 FloatParts128 *b, 724 FloatParts128 *c, 725 float_status *s, 726 int ab_mask, int abc_mask); 727 728 #define parts_pick_nan_muladd(A, B, C, S, ABM, ABCM) \ 729 PARTS_GENERIC_64_128(pick_nan_muladd, A)(A, B, C, S, ABM, ABCM) 730 731 static void parts64_canonicalize(FloatParts64 *p, float_status *status, 732 const FloatFmt *fmt); 733 static void parts128_canonicalize(FloatParts128 *p, float_status *status, 734 const FloatFmt *fmt); 735 736 #define parts_canonicalize(A, S, F) \ 737 PARTS_GENERIC_64_128(canonicalize, A)(A, S, F) 738 739 static void parts64_uncanon_normal(FloatParts64 *p, float_status *status, 740 const FloatFmt *fmt); 741 static void parts128_uncanon_normal(FloatParts128 *p, float_status *status, 742 const FloatFmt *fmt); 743 744 #define parts_uncanon_normal(A, S, F) \ 745 PARTS_GENERIC_64_128(uncanon_normal, A)(A, S, F) 746 747 static void parts64_uncanon(FloatParts64 *p, float_status *status, 748 const FloatFmt *fmt); 749 static void parts128_uncanon(FloatParts128 *p, float_status *status, 750 const FloatFmt *fmt); 751 752 #define parts_uncanon(A, S, F) \ 753 PARTS_GENERIC_64_128(uncanon, A)(A, S, F) 754 755 static void parts64_add_normal(FloatParts64 *a, FloatParts64 *b); 756 static void parts128_add_normal(FloatParts128 *a, FloatParts128 *b); 757 static void parts256_add_normal(FloatParts256 *a, FloatParts256 *b); 758 759 #define parts_add_normal(A, B) \ 760 PARTS_GENERIC_64_128_256(add_normal, A)(A, B) 761 762 static bool parts64_sub_normal(FloatParts64 *a, FloatParts64 *b); 763 static bool parts128_sub_normal(FloatParts128 *a, FloatParts128 *b); 764 static bool parts256_sub_normal(FloatParts256 *a, FloatParts256 *b); 765 766 #define parts_sub_normal(A, B) \ 767 PARTS_GENERIC_64_128_256(sub_normal, A)(A, B) 768 769 static FloatParts64 *parts64_addsub(FloatParts64 *a, FloatParts64 *b, 770 float_status *s, bool subtract); 771 static FloatParts128 *parts128_addsub(FloatParts128 *a, FloatParts128 *b, 772 float_status *s, bool subtract); 773 774 #define parts_addsub(A, B, S, Z) \ 775 PARTS_GENERIC_64_128(addsub, A)(A, B, S, Z) 776 777 static FloatParts64 *parts64_mul(FloatParts64 *a, FloatParts64 *b, 778 float_status *s); 779 static FloatParts128 *parts128_mul(FloatParts128 *a, FloatParts128 *b, 780 float_status *s); 781 782 #define parts_mul(A, B, S) \ 783 PARTS_GENERIC_64_128(mul, A)(A, B, S) 784 785 static FloatParts64 *parts64_muladd(FloatParts64 *a, FloatParts64 *b, 786 FloatParts64 *c, int flags, 787 float_status *s); 788 static FloatParts128 *parts128_muladd(FloatParts128 *a, FloatParts128 *b, 789 FloatParts128 *c, int flags, 790 float_status *s); 791 792 #define parts_muladd(A, B, C, Z, S) \ 793 PARTS_GENERIC_64_128(muladd, A)(A, B, C, Z, S) 794 795 static FloatParts64 *parts64_div(FloatParts64 *a, FloatParts64 *b, 796 float_status *s); 797 static FloatParts128 *parts128_div(FloatParts128 *a, FloatParts128 *b, 798 float_status *s); 799 800 #define parts_div(A, B, S) \ 801 PARTS_GENERIC_64_128(div, A)(A, B, S) 802 803 static FloatParts64 *parts64_modrem(FloatParts64 *a, FloatParts64 *b, 804 uint64_t *mod_quot, float_status *s); 805 static FloatParts128 *parts128_modrem(FloatParts128 *a, FloatParts128 *b, 806 uint64_t *mod_quot, float_status *s); 807 808 #define parts_modrem(A, B, Q, S) \ 809 PARTS_GENERIC_64_128(modrem, A)(A, B, Q, S) 810 811 static void parts64_sqrt(FloatParts64 *a, float_status *s, const FloatFmt *f); 812 static void parts128_sqrt(FloatParts128 *a, float_status *s, const FloatFmt *f); 813 814 #define parts_sqrt(A, S, F) \ 815 PARTS_GENERIC_64_128(sqrt, A)(A, S, F) 816 817 static bool parts64_round_to_int_normal(FloatParts64 *a, FloatRoundMode rm, 818 int scale, int frac_size); 819 static bool parts128_round_to_int_normal(FloatParts128 *a, FloatRoundMode r, 820 int scale, int frac_size); 821 822 #define parts_round_to_int_normal(A, R, C, F) \ 823 PARTS_GENERIC_64_128(round_to_int_normal, A)(A, R, C, F) 824 825 static void parts64_round_to_int(FloatParts64 *a, FloatRoundMode rm, 826 int scale, float_status *s, 827 const FloatFmt *fmt); 828 static void parts128_round_to_int(FloatParts128 *a, FloatRoundMode r, 829 int scale, float_status *s, 830 const FloatFmt *fmt); 831 832 #define parts_round_to_int(A, R, C, S, F) \ 833 PARTS_GENERIC_64_128(round_to_int, A)(A, R, C, S, F) 834 835 static int64_t parts64_float_to_sint(FloatParts64 *p, FloatRoundMode rmode, 836 int scale, int64_t min, int64_t max, 837 float_status *s); 838 static int64_t parts128_float_to_sint(FloatParts128 *p, FloatRoundMode rmode, 839 int scale, int64_t min, int64_t max, 840 float_status *s); 841 842 #define parts_float_to_sint(P, R, Z, MN, MX, S) \ 843 PARTS_GENERIC_64_128(float_to_sint, P)(P, R, Z, MN, MX, S) 844 845 static uint64_t parts64_float_to_uint(FloatParts64 *p, FloatRoundMode rmode, 846 int scale, uint64_t max, 847 float_status *s); 848 static uint64_t parts128_float_to_uint(FloatParts128 *p, FloatRoundMode rmode, 849 int scale, uint64_t max, 850 float_status *s); 851 852 #define parts_float_to_uint(P, R, Z, M, S) \ 853 PARTS_GENERIC_64_128(float_to_uint, P)(P, R, Z, M, S) 854 855 static void parts64_sint_to_float(FloatParts64 *p, int64_t a, 856 int scale, float_status *s); 857 static void parts128_sint_to_float(FloatParts128 *p, int64_t a, 858 int scale, float_status *s); 859 860 #define parts_sint_to_float(P, I, Z, S) \ 861 PARTS_GENERIC_64_128(sint_to_float, P)(P, I, Z, S) 862 863 static void parts64_uint_to_float(FloatParts64 *p, uint64_t a, 864 int scale, float_status *s); 865 static void parts128_uint_to_float(FloatParts128 *p, uint64_t a, 866 int scale, float_status *s); 867 868 #define parts_uint_to_float(P, I, Z, S) \ 869 PARTS_GENERIC_64_128(uint_to_float, P)(P, I, Z, S) 870 871 static FloatParts64 *parts64_minmax(FloatParts64 *a, FloatParts64 *b, 872 float_status *s, int flags); 873 static FloatParts128 *parts128_minmax(FloatParts128 *a, FloatParts128 *b, 874 float_status *s, int flags); 875 876 #define parts_minmax(A, B, S, F) \ 877 PARTS_GENERIC_64_128(minmax, A)(A, B, S, F) 878 879 static FloatRelation parts64_compare(FloatParts64 *a, FloatParts64 *b, 880 float_status *s, bool q); 881 static FloatRelation parts128_compare(FloatParts128 *a, FloatParts128 *b, 882 float_status *s, bool q); 883 884 #define parts_compare(A, B, S, Q) \ 885 PARTS_GENERIC_64_128(compare, A)(A, B, S, Q) 886 887 static void parts64_scalbn(FloatParts64 *a, int n, float_status *s); 888 static void parts128_scalbn(FloatParts128 *a, int n, float_status *s); 889 890 #define parts_scalbn(A, N, S) \ 891 PARTS_GENERIC_64_128(scalbn, A)(A, N, S) 892 893 static void parts64_log2(FloatParts64 *a, float_status *s, const FloatFmt *f); 894 static void parts128_log2(FloatParts128 *a, float_status *s, const FloatFmt *f); 895 896 #define parts_log2(A, S, F) \ 897 PARTS_GENERIC_64_128(log2, A)(A, S, F) 898 899 /* 900 * Helper functions for softfloat-parts.c.inc, per-size operations. 901 */ 902 903 #define FRAC_GENERIC_64_128(NAME, P) \ 904 _Generic((P), FloatParts64 *: frac64_##NAME, \ 905 FloatParts128 *: frac128_##NAME) 906 907 #define FRAC_GENERIC_64_128_256(NAME, P) \ 908 _Generic((P), FloatParts64 *: frac64_##NAME, \ 909 FloatParts128 *: frac128_##NAME, \ 910 FloatParts256 *: frac256_##NAME) 911 912 static bool frac64_add(FloatParts64 *r, FloatParts64 *a, FloatParts64 *b) 913 { 914 return uadd64_overflow(a->frac, b->frac, &r->frac); 915 } 916 917 static bool frac128_add(FloatParts128 *r, FloatParts128 *a, FloatParts128 *b) 918 { 919 bool c = 0; 920 r->frac_lo = uadd64_carry(a->frac_lo, b->frac_lo, &c); 921 r->frac_hi = uadd64_carry(a->frac_hi, b->frac_hi, &c); 922 return c; 923 } 924 925 static bool frac256_add(FloatParts256 *r, FloatParts256 *a, FloatParts256 *b) 926 { 927 bool c = 0; 928 r->frac_lo = uadd64_carry(a->frac_lo, b->frac_lo, &c); 929 r->frac_lm = uadd64_carry(a->frac_lm, b->frac_lm, &c); 930 r->frac_hm = uadd64_carry(a->frac_hm, b->frac_hm, &c); 931 r->frac_hi = uadd64_carry(a->frac_hi, b->frac_hi, &c); 932 return c; 933 } 934 935 #define frac_add(R, A, B) FRAC_GENERIC_64_128_256(add, R)(R, A, B) 936 937 static bool frac64_addi(FloatParts64 *r, FloatParts64 *a, uint64_t c) 938 { 939 return uadd64_overflow(a->frac, c, &r->frac); 940 } 941 942 static bool frac128_addi(FloatParts128 *r, FloatParts128 *a, uint64_t c) 943 { 944 c = uadd64_overflow(a->frac_lo, c, &r->frac_lo); 945 return uadd64_overflow(a->frac_hi, c, &r->frac_hi); 946 } 947 948 #define frac_addi(R, A, C) FRAC_GENERIC_64_128(addi, R)(R, A, C) 949 950 static void frac64_allones(FloatParts64 *a) 951 { 952 a->frac = -1; 953 } 954 955 static void frac128_allones(FloatParts128 *a) 956 { 957 a->frac_hi = a->frac_lo = -1; 958 } 959 960 #define frac_allones(A) FRAC_GENERIC_64_128(allones, A)(A) 961 962 static FloatRelation frac64_cmp(FloatParts64 *a, FloatParts64 *b) 963 { 964 return (a->frac == b->frac ? float_relation_equal 965 : a->frac < b->frac ? float_relation_less 966 : float_relation_greater); 967 } 968 969 static FloatRelation frac128_cmp(FloatParts128 *a, FloatParts128 *b) 970 { 971 uint64_t ta = a->frac_hi, tb = b->frac_hi; 972 if (ta == tb) { 973 ta = a->frac_lo, tb = b->frac_lo; 974 if (ta == tb) { 975 return float_relation_equal; 976 } 977 } 978 return ta < tb ? float_relation_less : float_relation_greater; 979 } 980 981 #define frac_cmp(A, B) FRAC_GENERIC_64_128(cmp, A)(A, B) 982 983 static void frac64_clear(FloatParts64 *a) 984 { 985 a->frac = 0; 986 } 987 988 static void frac128_clear(FloatParts128 *a) 989 { 990 a->frac_hi = a->frac_lo = 0; 991 } 992 993 #define frac_clear(A) FRAC_GENERIC_64_128(clear, A)(A) 994 995 static bool frac64_div(FloatParts64 *a, FloatParts64 *b) 996 { 997 uint64_t n1, n0, r, q; 998 bool ret; 999 1000 /* 1001 * We want a 2*N / N-bit division to produce exactly an N-bit 1002 * result, so that we do not lose any precision and so that we 1003 * do not have to renormalize afterward. If A.frac < B.frac, 1004 * then division would produce an (N-1)-bit result; shift A left 1005 * by one to produce the an N-bit result, and return true to 1006 * decrement the exponent to match. 1007 * 1008 * The udiv_qrnnd algorithm that we're using requires normalization, 1009 * i.e. the msb of the denominator must be set, which is already true. 1010 */ 1011 ret = a->frac < b->frac; 1012 if (ret) { 1013 n0 = a->frac; 1014 n1 = 0; 1015 } else { 1016 n0 = a->frac >> 1; 1017 n1 = a->frac << 63; 1018 } 1019 q = udiv_qrnnd(&r, n0, n1, b->frac); 1020 1021 /* Set lsb if there is a remainder, to set inexact. */ 1022 a->frac = q | (r != 0); 1023 1024 return ret; 1025 } 1026 1027 static bool frac128_div(FloatParts128 *a, FloatParts128 *b) 1028 { 1029 uint64_t q0, q1, a0, a1, b0, b1; 1030 uint64_t r0, r1, r2, r3, t0, t1, t2, t3; 1031 bool ret = false; 1032 1033 a0 = a->frac_hi, a1 = a->frac_lo; 1034 b0 = b->frac_hi, b1 = b->frac_lo; 1035 1036 ret = lt128(a0, a1, b0, b1); 1037 if (!ret) { 1038 a1 = shr_double(a0, a1, 1); 1039 a0 = a0 >> 1; 1040 } 1041 1042 /* Use 128/64 -> 64 division as estimate for 192/128 -> 128 division. */ 1043 q0 = estimateDiv128To64(a0, a1, b0); 1044 1045 /* 1046 * Estimate is high because B1 was not included (unless B1 == 0). 1047 * Reduce quotient and increase remainder until remainder is non-negative. 1048 * This loop will execute 0 to 2 times. 1049 */ 1050 mul128By64To192(b0, b1, q0, &t0, &t1, &t2); 1051 sub192(a0, a1, 0, t0, t1, t2, &r0, &r1, &r2); 1052 while (r0 != 0) { 1053 q0--; 1054 add192(r0, r1, r2, 0, b0, b1, &r0, &r1, &r2); 1055 } 1056 1057 /* Repeat using the remainder, producing a second word of quotient. */ 1058 q1 = estimateDiv128To64(r1, r2, b0); 1059 mul128By64To192(b0, b1, q1, &t1, &t2, &t3); 1060 sub192(r1, r2, 0, t1, t2, t3, &r1, &r2, &r3); 1061 while (r1 != 0) { 1062 q1--; 1063 add192(r1, r2, r3, 0, b0, b1, &r1, &r2, &r3); 1064 } 1065 1066 /* Any remainder indicates inexact; set sticky bit. */ 1067 q1 |= (r2 | r3) != 0; 1068 1069 a->frac_hi = q0; 1070 a->frac_lo = q1; 1071 return ret; 1072 } 1073 1074 #define frac_div(A, B) FRAC_GENERIC_64_128(div, A)(A, B) 1075 1076 static bool frac64_eqz(FloatParts64 *a) 1077 { 1078 return a->frac == 0; 1079 } 1080 1081 static bool frac128_eqz(FloatParts128 *a) 1082 { 1083 return (a->frac_hi | a->frac_lo) == 0; 1084 } 1085 1086 #define frac_eqz(A) FRAC_GENERIC_64_128(eqz, A)(A) 1087 1088 static void frac64_mulw(FloatParts128 *r, FloatParts64 *a, FloatParts64 *b) 1089 { 1090 mulu64(&r->frac_lo, &r->frac_hi, a->frac, b->frac); 1091 } 1092 1093 static void frac128_mulw(FloatParts256 *r, FloatParts128 *a, FloatParts128 *b) 1094 { 1095 mul128To256(a->frac_hi, a->frac_lo, b->frac_hi, b->frac_lo, 1096 &r->frac_hi, &r->frac_hm, &r->frac_lm, &r->frac_lo); 1097 } 1098 1099 #define frac_mulw(R, A, B) FRAC_GENERIC_64_128(mulw, A)(R, A, B) 1100 1101 static void frac64_neg(FloatParts64 *a) 1102 { 1103 a->frac = -a->frac; 1104 } 1105 1106 static void frac128_neg(FloatParts128 *a) 1107 { 1108 bool c = 0; 1109 a->frac_lo = usub64_borrow(0, a->frac_lo, &c); 1110 a->frac_hi = usub64_borrow(0, a->frac_hi, &c); 1111 } 1112 1113 static void frac256_neg(FloatParts256 *a) 1114 { 1115 bool c = 0; 1116 a->frac_lo = usub64_borrow(0, a->frac_lo, &c); 1117 a->frac_lm = usub64_borrow(0, a->frac_lm, &c); 1118 a->frac_hm = usub64_borrow(0, a->frac_hm, &c); 1119 a->frac_hi = usub64_borrow(0, a->frac_hi, &c); 1120 } 1121 1122 #define frac_neg(A) FRAC_GENERIC_64_128_256(neg, A)(A) 1123 1124 static int frac64_normalize(FloatParts64 *a) 1125 { 1126 if (a->frac) { 1127 int shift = clz64(a->frac); 1128 a->frac <<= shift; 1129 return shift; 1130 } 1131 return 64; 1132 } 1133 1134 static int frac128_normalize(FloatParts128 *a) 1135 { 1136 if (a->frac_hi) { 1137 int shl = clz64(a->frac_hi); 1138 a->frac_hi = shl_double(a->frac_hi, a->frac_lo, shl); 1139 a->frac_lo <<= shl; 1140 return shl; 1141 } else if (a->frac_lo) { 1142 int shl = clz64(a->frac_lo); 1143 a->frac_hi = a->frac_lo << shl; 1144 a->frac_lo = 0; 1145 return shl + 64; 1146 } 1147 return 128; 1148 } 1149 1150 static int frac256_normalize(FloatParts256 *a) 1151 { 1152 uint64_t a0 = a->frac_hi, a1 = a->frac_hm; 1153 uint64_t a2 = a->frac_lm, a3 = a->frac_lo; 1154 int ret, shl; 1155 1156 if (likely(a0)) { 1157 shl = clz64(a0); 1158 if (shl == 0) { 1159 return 0; 1160 } 1161 ret = shl; 1162 } else { 1163 if (a1) { 1164 ret = 64; 1165 a0 = a1, a1 = a2, a2 = a3, a3 = 0; 1166 } else if (a2) { 1167 ret = 128; 1168 a0 = a2, a1 = a3, a2 = 0, a3 = 0; 1169 } else if (a3) { 1170 ret = 192; 1171 a0 = a3, a1 = 0, a2 = 0, a3 = 0; 1172 } else { 1173 ret = 256; 1174 a0 = 0, a1 = 0, a2 = 0, a3 = 0; 1175 goto done; 1176 } 1177 shl = clz64(a0); 1178 if (shl == 0) { 1179 goto done; 1180 } 1181 ret += shl; 1182 } 1183 1184 a0 = shl_double(a0, a1, shl); 1185 a1 = shl_double(a1, a2, shl); 1186 a2 = shl_double(a2, a3, shl); 1187 a3 <<= shl; 1188 1189 done: 1190 a->frac_hi = a0; 1191 a->frac_hm = a1; 1192 a->frac_lm = a2; 1193 a->frac_lo = a3; 1194 return ret; 1195 } 1196 1197 #define frac_normalize(A) FRAC_GENERIC_64_128_256(normalize, A)(A) 1198 1199 static void frac64_modrem(FloatParts64 *a, FloatParts64 *b, uint64_t *mod_quot) 1200 { 1201 uint64_t a0, a1, b0, t0, t1, q, quot; 1202 int exp_diff = a->exp - b->exp; 1203 int shift; 1204 1205 a0 = a->frac; 1206 a1 = 0; 1207 1208 if (exp_diff < -1) { 1209 if (mod_quot) { 1210 *mod_quot = 0; 1211 } 1212 return; 1213 } 1214 if (exp_diff == -1) { 1215 a0 >>= 1; 1216 exp_diff = 0; 1217 } 1218 1219 b0 = b->frac; 1220 quot = q = b0 <= a0; 1221 if (q) { 1222 a0 -= b0; 1223 } 1224 1225 exp_diff -= 64; 1226 while (exp_diff > 0) { 1227 q = estimateDiv128To64(a0, a1, b0); 1228 q = q > 2 ? q - 2 : 0; 1229 mul64To128(b0, q, &t0, &t1); 1230 sub128(a0, a1, t0, t1, &a0, &a1); 1231 shortShift128Left(a0, a1, 62, &a0, &a1); 1232 exp_diff -= 62; 1233 quot = (quot << 62) + q; 1234 } 1235 1236 exp_diff += 64; 1237 if (exp_diff > 0) { 1238 q = estimateDiv128To64(a0, a1, b0); 1239 q = q > 2 ? (q - 2) >> (64 - exp_diff) : 0; 1240 mul64To128(b0, q << (64 - exp_diff), &t0, &t1); 1241 sub128(a0, a1, t0, t1, &a0, &a1); 1242 shortShift128Left(0, b0, 64 - exp_diff, &t0, &t1); 1243 while (le128(t0, t1, a0, a1)) { 1244 ++q; 1245 sub128(a0, a1, t0, t1, &a0, &a1); 1246 } 1247 quot = (exp_diff < 64 ? quot << exp_diff : 0) + q; 1248 } else { 1249 t0 = b0; 1250 t1 = 0; 1251 } 1252 1253 if (mod_quot) { 1254 *mod_quot = quot; 1255 } else { 1256 sub128(t0, t1, a0, a1, &t0, &t1); 1257 if (lt128(t0, t1, a0, a1) || 1258 (eq128(t0, t1, a0, a1) && (q & 1))) { 1259 a0 = t0; 1260 a1 = t1; 1261 a->sign = !a->sign; 1262 } 1263 } 1264 1265 if (likely(a0)) { 1266 shift = clz64(a0); 1267 shortShift128Left(a0, a1, shift, &a0, &a1); 1268 } else if (likely(a1)) { 1269 shift = clz64(a1); 1270 a0 = a1 << shift; 1271 a1 = 0; 1272 shift += 64; 1273 } else { 1274 a->cls = float_class_zero; 1275 return; 1276 } 1277 1278 a->exp = b->exp + exp_diff - shift; 1279 a->frac = a0 | (a1 != 0); 1280 } 1281 1282 static void frac128_modrem(FloatParts128 *a, FloatParts128 *b, 1283 uint64_t *mod_quot) 1284 { 1285 uint64_t a0, a1, a2, b0, b1, t0, t1, t2, q, quot; 1286 int exp_diff = a->exp - b->exp; 1287 int shift; 1288 1289 a0 = a->frac_hi; 1290 a1 = a->frac_lo; 1291 a2 = 0; 1292 1293 if (exp_diff < -1) { 1294 if (mod_quot) { 1295 *mod_quot = 0; 1296 } 1297 return; 1298 } 1299 if (exp_diff == -1) { 1300 shift128Right(a0, a1, 1, &a0, &a1); 1301 exp_diff = 0; 1302 } 1303 1304 b0 = b->frac_hi; 1305 b1 = b->frac_lo; 1306 1307 quot = q = le128(b0, b1, a0, a1); 1308 if (q) { 1309 sub128(a0, a1, b0, b1, &a0, &a1); 1310 } 1311 1312 exp_diff -= 64; 1313 while (exp_diff > 0) { 1314 q = estimateDiv128To64(a0, a1, b0); 1315 q = q > 4 ? q - 4 : 0; 1316 mul128By64To192(b0, b1, q, &t0, &t1, &t2); 1317 sub192(a0, a1, a2, t0, t1, t2, &a0, &a1, &a2); 1318 shortShift192Left(a0, a1, a2, 61, &a0, &a1, &a2); 1319 exp_diff -= 61; 1320 quot = (quot << 61) + q; 1321 } 1322 1323 exp_diff += 64; 1324 if (exp_diff > 0) { 1325 q = estimateDiv128To64(a0, a1, b0); 1326 q = q > 4 ? (q - 4) >> (64 - exp_diff) : 0; 1327 mul128By64To192(b0, b1, q << (64 - exp_diff), &t0, &t1, &t2); 1328 sub192(a0, a1, a2, t0, t1, t2, &a0, &a1, &a2); 1329 shortShift192Left(0, b0, b1, 64 - exp_diff, &t0, &t1, &t2); 1330 while (le192(t0, t1, t2, a0, a1, a2)) { 1331 ++q; 1332 sub192(a0, a1, a2, t0, t1, t2, &a0, &a1, &a2); 1333 } 1334 quot = (exp_diff < 64 ? quot << exp_diff : 0) + q; 1335 } else { 1336 t0 = b0; 1337 t1 = b1; 1338 t2 = 0; 1339 } 1340 1341 if (mod_quot) { 1342 *mod_quot = quot; 1343 } else { 1344 sub192(t0, t1, t2, a0, a1, a2, &t0, &t1, &t2); 1345 if (lt192(t0, t1, t2, a0, a1, a2) || 1346 (eq192(t0, t1, t2, a0, a1, a2) && (q & 1))) { 1347 a0 = t0; 1348 a1 = t1; 1349 a2 = t2; 1350 a->sign = !a->sign; 1351 } 1352 } 1353 1354 if (likely(a0)) { 1355 shift = clz64(a0); 1356 shortShift192Left(a0, a1, a2, shift, &a0, &a1, &a2); 1357 } else if (likely(a1)) { 1358 shift = clz64(a1); 1359 shortShift128Left(a1, a2, shift, &a0, &a1); 1360 a2 = 0; 1361 shift += 64; 1362 } else if (likely(a2)) { 1363 shift = clz64(a2); 1364 a0 = a2 << shift; 1365 a1 = a2 = 0; 1366 shift += 128; 1367 } else { 1368 a->cls = float_class_zero; 1369 return; 1370 } 1371 1372 a->exp = b->exp + exp_diff - shift; 1373 a->frac_hi = a0; 1374 a->frac_lo = a1 | (a2 != 0); 1375 } 1376 1377 #define frac_modrem(A, B, Q) FRAC_GENERIC_64_128(modrem, A)(A, B, Q) 1378 1379 static void frac64_shl(FloatParts64 *a, int c) 1380 { 1381 a->frac <<= c; 1382 } 1383 1384 static void frac128_shl(FloatParts128 *a, int c) 1385 { 1386 uint64_t a0 = a->frac_hi, a1 = a->frac_lo; 1387 1388 if (c & 64) { 1389 a0 = a1, a1 = 0; 1390 } 1391 1392 c &= 63; 1393 if (c) { 1394 a0 = shl_double(a0, a1, c); 1395 a1 = a1 << c; 1396 } 1397 1398 a->frac_hi = a0; 1399 a->frac_lo = a1; 1400 } 1401 1402 #define frac_shl(A, C) FRAC_GENERIC_64_128(shl, A)(A, C) 1403 1404 static void frac64_shr(FloatParts64 *a, int c) 1405 { 1406 a->frac >>= c; 1407 } 1408 1409 static void frac128_shr(FloatParts128 *a, int c) 1410 { 1411 uint64_t a0 = a->frac_hi, a1 = a->frac_lo; 1412 1413 if (c & 64) { 1414 a1 = a0, a0 = 0; 1415 } 1416 1417 c &= 63; 1418 if (c) { 1419 a1 = shr_double(a0, a1, c); 1420 a0 = a0 >> c; 1421 } 1422 1423 a->frac_hi = a0; 1424 a->frac_lo = a1; 1425 } 1426 1427 #define frac_shr(A, C) FRAC_GENERIC_64_128(shr, A)(A, C) 1428 1429 static void frac64_shrjam(FloatParts64 *a, int c) 1430 { 1431 uint64_t a0 = a->frac; 1432 1433 if (likely(c != 0)) { 1434 if (likely(c < 64)) { 1435 a0 = (a0 >> c) | (shr_double(a0, 0, c) != 0); 1436 } else { 1437 a0 = a0 != 0; 1438 } 1439 a->frac = a0; 1440 } 1441 } 1442 1443 static void frac128_shrjam(FloatParts128 *a, int c) 1444 { 1445 uint64_t a0 = a->frac_hi, a1 = a->frac_lo; 1446 uint64_t sticky = 0; 1447 1448 if (unlikely(c == 0)) { 1449 return; 1450 } else if (likely(c < 64)) { 1451 /* nothing */ 1452 } else if (likely(c < 128)) { 1453 sticky = a1; 1454 a1 = a0; 1455 a0 = 0; 1456 c &= 63; 1457 if (c == 0) { 1458 goto done; 1459 } 1460 } else { 1461 sticky = a0 | a1; 1462 a0 = a1 = 0; 1463 goto done; 1464 } 1465 1466 sticky |= shr_double(a1, 0, c); 1467 a1 = shr_double(a0, a1, c); 1468 a0 = a0 >> c; 1469 1470 done: 1471 a->frac_lo = a1 | (sticky != 0); 1472 a->frac_hi = a0; 1473 } 1474 1475 static void frac256_shrjam(FloatParts256 *a, int c) 1476 { 1477 uint64_t a0 = a->frac_hi, a1 = a->frac_hm; 1478 uint64_t a2 = a->frac_lm, a3 = a->frac_lo; 1479 uint64_t sticky = 0; 1480 1481 if (unlikely(c == 0)) { 1482 return; 1483 } else if (likely(c < 64)) { 1484 /* nothing */ 1485 } else if (likely(c < 256)) { 1486 if (unlikely(c & 128)) { 1487 sticky |= a2 | a3; 1488 a3 = a1, a2 = a0, a1 = 0, a0 = 0; 1489 } 1490 if (unlikely(c & 64)) { 1491 sticky |= a3; 1492 a3 = a2, a2 = a1, a1 = a0, a0 = 0; 1493 } 1494 c &= 63; 1495 if (c == 0) { 1496 goto done; 1497 } 1498 } else { 1499 sticky = a0 | a1 | a2 | a3; 1500 a0 = a1 = a2 = a3 = 0; 1501 goto done; 1502 } 1503 1504 sticky |= shr_double(a3, 0, c); 1505 a3 = shr_double(a2, a3, c); 1506 a2 = shr_double(a1, a2, c); 1507 a1 = shr_double(a0, a1, c); 1508 a0 = a0 >> c; 1509 1510 done: 1511 a->frac_lo = a3 | (sticky != 0); 1512 a->frac_lm = a2; 1513 a->frac_hm = a1; 1514 a->frac_hi = a0; 1515 } 1516 1517 #define frac_shrjam(A, C) FRAC_GENERIC_64_128_256(shrjam, A)(A, C) 1518 1519 static bool frac64_sub(FloatParts64 *r, FloatParts64 *a, FloatParts64 *b) 1520 { 1521 return usub64_overflow(a->frac, b->frac, &r->frac); 1522 } 1523 1524 static bool frac128_sub(FloatParts128 *r, FloatParts128 *a, FloatParts128 *b) 1525 { 1526 bool c = 0; 1527 r->frac_lo = usub64_borrow(a->frac_lo, b->frac_lo, &c); 1528 r->frac_hi = usub64_borrow(a->frac_hi, b->frac_hi, &c); 1529 return c; 1530 } 1531 1532 static bool frac256_sub(FloatParts256 *r, FloatParts256 *a, FloatParts256 *b) 1533 { 1534 bool c = 0; 1535 r->frac_lo = usub64_borrow(a->frac_lo, b->frac_lo, &c); 1536 r->frac_lm = usub64_borrow(a->frac_lm, b->frac_lm, &c); 1537 r->frac_hm = usub64_borrow(a->frac_hm, b->frac_hm, &c); 1538 r->frac_hi = usub64_borrow(a->frac_hi, b->frac_hi, &c); 1539 return c; 1540 } 1541 1542 #define frac_sub(R, A, B) FRAC_GENERIC_64_128_256(sub, R)(R, A, B) 1543 1544 static void frac64_truncjam(FloatParts64 *r, FloatParts128 *a) 1545 { 1546 r->frac = a->frac_hi | (a->frac_lo != 0); 1547 } 1548 1549 static void frac128_truncjam(FloatParts128 *r, FloatParts256 *a) 1550 { 1551 r->frac_hi = a->frac_hi; 1552 r->frac_lo = a->frac_hm | ((a->frac_lm | a->frac_lo) != 0); 1553 } 1554 1555 #define frac_truncjam(R, A) FRAC_GENERIC_64_128(truncjam, R)(R, A) 1556 1557 static void frac64_widen(FloatParts128 *r, FloatParts64 *a) 1558 { 1559 r->frac_hi = a->frac; 1560 r->frac_lo = 0; 1561 } 1562 1563 static void frac128_widen(FloatParts256 *r, FloatParts128 *a) 1564 { 1565 r->frac_hi = a->frac_hi; 1566 r->frac_hm = a->frac_lo; 1567 r->frac_lm = 0; 1568 r->frac_lo = 0; 1569 } 1570 1571 #define frac_widen(A, B) FRAC_GENERIC_64_128(widen, B)(A, B) 1572 1573 /* 1574 * Reciprocal sqrt table. 1 bit of exponent, 6-bits of mantessa. 1575 * From https://git.musl-libc.org/cgit/musl/tree/src/math/sqrt_data.c 1576 * and thus MIT licenced. 1577 */ 1578 static const uint16_t rsqrt_tab[128] = { 1579 0xb451, 0xb2f0, 0xb196, 0xb044, 0xaef9, 0xadb6, 0xac79, 0xab43, 1580 0xaa14, 0xa8eb, 0xa7c8, 0xa6aa, 0xa592, 0xa480, 0xa373, 0xa26b, 1581 0xa168, 0xa06a, 0x9f70, 0x9e7b, 0x9d8a, 0x9c9d, 0x9bb5, 0x9ad1, 1582 0x99f0, 0x9913, 0x983a, 0x9765, 0x9693, 0x95c4, 0x94f8, 0x9430, 1583 0x936b, 0x92a9, 0x91ea, 0x912e, 0x9075, 0x8fbe, 0x8f0a, 0x8e59, 1584 0x8daa, 0x8cfe, 0x8c54, 0x8bac, 0x8b07, 0x8a64, 0x89c4, 0x8925, 1585 0x8889, 0x87ee, 0x8756, 0x86c0, 0x862b, 0x8599, 0x8508, 0x8479, 1586 0x83ec, 0x8361, 0x82d8, 0x8250, 0x81c9, 0x8145, 0x80c2, 0x8040, 1587 0xff02, 0xfd0e, 0xfb25, 0xf947, 0xf773, 0xf5aa, 0xf3ea, 0xf234, 1588 0xf087, 0xeee3, 0xed47, 0xebb3, 0xea27, 0xe8a3, 0xe727, 0xe5b2, 1589 0xe443, 0xe2dc, 0xe17a, 0xe020, 0xdecb, 0xdd7d, 0xdc34, 0xdaf1, 1590 0xd9b3, 0xd87b, 0xd748, 0xd61a, 0xd4f1, 0xd3cd, 0xd2ad, 0xd192, 1591 0xd07b, 0xcf69, 0xce5b, 0xcd51, 0xcc4a, 0xcb48, 0xca4a, 0xc94f, 1592 0xc858, 0xc764, 0xc674, 0xc587, 0xc49d, 0xc3b7, 0xc2d4, 0xc1f4, 1593 0xc116, 0xc03c, 0xbf65, 0xbe90, 0xbdbe, 0xbcef, 0xbc23, 0xbb59, 1594 0xba91, 0xb9cc, 0xb90a, 0xb84a, 0xb78c, 0xb6d0, 0xb617, 0xb560, 1595 }; 1596 1597 #define partsN(NAME) glue(glue(glue(parts,N),_),NAME) 1598 #define FloatPartsN glue(FloatParts,N) 1599 #define FloatPartsW glue(FloatParts,W) 1600 1601 #define N 64 1602 #define W 128 1603 1604 #include "softfloat-parts-addsub.c.inc" 1605 #include "softfloat-parts.c.inc" 1606 1607 #undef N 1608 #undef W 1609 #define N 128 1610 #define W 256 1611 1612 #include "softfloat-parts-addsub.c.inc" 1613 #include "softfloat-parts.c.inc" 1614 1615 #undef N 1616 #undef W 1617 #define N 256 1618 1619 #include "softfloat-parts-addsub.c.inc" 1620 1621 #undef N 1622 #undef W 1623 #undef partsN 1624 #undef FloatPartsN 1625 #undef FloatPartsW 1626 1627 /* 1628 * Pack/unpack routines with a specific FloatFmt. 1629 */ 1630 1631 static void float16a_unpack_canonical(FloatParts64 *p, float16 f, 1632 float_status *s, const FloatFmt *params) 1633 { 1634 float16_unpack_raw(p, f); 1635 parts_canonicalize(p, s, params); 1636 } 1637 1638 static void float16_unpack_canonical(FloatParts64 *p, float16 f, 1639 float_status *s) 1640 { 1641 float16a_unpack_canonical(p, f, s, &float16_params); 1642 } 1643 1644 static void bfloat16_unpack_canonical(FloatParts64 *p, bfloat16 f, 1645 float_status *s) 1646 { 1647 bfloat16_unpack_raw(p, f); 1648 parts_canonicalize(p, s, &bfloat16_params); 1649 } 1650 1651 static float16 float16a_round_pack_canonical(FloatParts64 *p, 1652 float_status *s, 1653 const FloatFmt *params) 1654 { 1655 parts_uncanon(p, s, params); 1656 return float16_pack_raw(p); 1657 } 1658 1659 static float16 float16_round_pack_canonical(FloatParts64 *p, 1660 float_status *s) 1661 { 1662 return float16a_round_pack_canonical(p, s, &float16_params); 1663 } 1664 1665 static bfloat16 bfloat16_round_pack_canonical(FloatParts64 *p, 1666 float_status *s) 1667 { 1668 parts_uncanon(p, s, &bfloat16_params); 1669 return bfloat16_pack_raw(p); 1670 } 1671 1672 static void float32_unpack_canonical(FloatParts64 *p, float32 f, 1673 float_status *s) 1674 { 1675 float32_unpack_raw(p, f); 1676 parts_canonicalize(p, s, &float32_params); 1677 } 1678 1679 static float32 float32_round_pack_canonical(FloatParts64 *p, 1680 float_status *s) 1681 { 1682 parts_uncanon(p, s, &float32_params); 1683 return float32_pack_raw(p); 1684 } 1685 1686 static void float64_unpack_canonical(FloatParts64 *p, float64 f, 1687 float_status *s) 1688 { 1689 float64_unpack_raw(p, f); 1690 parts_canonicalize(p, s, &float64_params); 1691 } 1692 1693 static float64 float64_round_pack_canonical(FloatParts64 *p, 1694 float_status *s) 1695 { 1696 parts_uncanon(p, s, &float64_params); 1697 return float64_pack_raw(p); 1698 } 1699 1700 static float64 float64r32_round_pack_canonical(FloatParts64 *p, 1701 float_status *s) 1702 { 1703 parts_uncanon(p, s, &float32_params); 1704 1705 /* 1706 * In parts_uncanon, we placed the fraction for float32 at the lsb. 1707 * We need to adjust the fraction higher so that the least N bits are 1708 * zero, and the fraction is adjacent to the float64 implicit bit. 1709 */ 1710 switch (p->cls) { 1711 case float_class_normal: 1712 if (unlikely(p->exp == 0)) { 1713 /* 1714 * The result is denormal for float32, but can be represented 1715 * in normalized form for float64. Adjust, per canonicalize. 1716 */ 1717 int shift = frac_normalize(p); 1718 p->exp = (float32_params.frac_shift - 1719 float32_params.exp_bias - shift + 1 + 1720 float64_params.exp_bias); 1721 frac_shr(p, float64_params.frac_shift); 1722 } else { 1723 frac_shl(p, float32_params.frac_shift - float64_params.frac_shift); 1724 p->exp += float64_params.exp_bias - float32_params.exp_bias; 1725 } 1726 break; 1727 case float_class_snan: 1728 case float_class_qnan: 1729 frac_shl(p, float32_params.frac_shift - float64_params.frac_shift); 1730 p->exp = float64_params.exp_max; 1731 break; 1732 case float_class_inf: 1733 p->exp = float64_params.exp_max; 1734 break; 1735 case float_class_zero: 1736 break; 1737 default: 1738 g_assert_not_reached(); 1739 } 1740 1741 return float64_pack_raw(p); 1742 } 1743 1744 static void float128_unpack_canonical(FloatParts128 *p, float128 f, 1745 float_status *s) 1746 { 1747 float128_unpack_raw(p, f); 1748 parts_canonicalize(p, s, &float128_params); 1749 } 1750 1751 static float128 float128_round_pack_canonical(FloatParts128 *p, 1752 float_status *s) 1753 { 1754 parts_uncanon(p, s, &float128_params); 1755 return float128_pack_raw(p); 1756 } 1757 1758 /* Returns false if the encoding is invalid. */ 1759 static bool floatx80_unpack_canonical(FloatParts128 *p, floatx80 f, 1760 float_status *s) 1761 { 1762 /* Ensure rounding precision is set before beginning. */ 1763 switch (s->floatx80_rounding_precision) { 1764 case floatx80_precision_x: 1765 case floatx80_precision_d: 1766 case floatx80_precision_s: 1767 break; 1768 default: 1769 g_assert_not_reached(); 1770 } 1771 1772 if (unlikely(floatx80_invalid_encoding(f))) { 1773 float_raise(float_flag_invalid, s); 1774 return false; 1775 } 1776 1777 floatx80_unpack_raw(p, f); 1778 1779 if (likely(p->exp != floatx80_params[floatx80_precision_x].exp_max)) { 1780 parts_canonicalize(p, s, &floatx80_params[floatx80_precision_x]); 1781 } else { 1782 /* The explicit integer bit is ignored, after invalid checks. */ 1783 p->frac_hi &= MAKE_64BIT_MASK(0, 63); 1784 p->cls = (p->frac_hi == 0 ? float_class_inf 1785 : parts_is_snan_frac(p->frac_hi, s) 1786 ? float_class_snan : float_class_qnan); 1787 } 1788 return true; 1789 } 1790 1791 static floatx80 floatx80_round_pack_canonical(FloatParts128 *p, 1792 float_status *s) 1793 { 1794 const FloatFmt *fmt = &floatx80_params[s->floatx80_rounding_precision]; 1795 uint64_t frac; 1796 int exp; 1797 1798 switch (p->cls) { 1799 case float_class_normal: 1800 if (s->floatx80_rounding_precision == floatx80_precision_x) { 1801 parts_uncanon_normal(p, s, fmt); 1802 frac = p->frac_hi; 1803 exp = p->exp; 1804 } else { 1805 FloatParts64 p64; 1806 1807 p64.sign = p->sign; 1808 p64.exp = p->exp; 1809 frac_truncjam(&p64, p); 1810 parts_uncanon_normal(&p64, s, fmt); 1811 frac = p64.frac; 1812 exp = p64.exp; 1813 } 1814 if (exp != fmt->exp_max) { 1815 break; 1816 } 1817 /* rounded to inf -- fall through to set frac correctly */ 1818 1819 case float_class_inf: 1820 /* x86 and m68k differ in the setting of the integer bit. */ 1821 frac = floatx80_infinity_low; 1822 exp = fmt->exp_max; 1823 break; 1824 1825 case float_class_zero: 1826 frac = 0; 1827 exp = 0; 1828 break; 1829 1830 case float_class_snan: 1831 case float_class_qnan: 1832 /* NaNs have the integer bit set. */ 1833 frac = p->frac_hi | (1ull << 63); 1834 exp = fmt->exp_max; 1835 break; 1836 1837 default: 1838 g_assert_not_reached(); 1839 } 1840 1841 return packFloatx80(p->sign, exp, frac); 1842 } 1843 1844 /* 1845 * Addition and subtraction 1846 */ 1847 1848 static float16 QEMU_FLATTEN 1849 float16_addsub(float16 a, float16 b, float_status *status, bool subtract) 1850 { 1851 FloatParts64 pa, pb, *pr; 1852 1853 float16_unpack_canonical(&pa, a, status); 1854 float16_unpack_canonical(&pb, b, status); 1855 pr = parts_addsub(&pa, &pb, status, subtract); 1856 1857 return float16_round_pack_canonical(pr, status); 1858 } 1859 1860 float16 float16_add(float16 a, float16 b, float_status *status) 1861 { 1862 return float16_addsub(a, b, status, false); 1863 } 1864 1865 float16 float16_sub(float16 a, float16 b, float_status *status) 1866 { 1867 return float16_addsub(a, b, status, true); 1868 } 1869 1870 static float32 QEMU_SOFTFLOAT_ATTR 1871 soft_f32_addsub(float32 a, float32 b, float_status *status, bool subtract) 1872 { 1873 FloatParts64 pa, pb, *pr; 1874 1875 float32_unpack_canonical(&pa, a, status); 1876 float32_unpack_canonical(&pb, b, status); 1877 pr = parts_addsub(&pa, &pb, status, subtract); 1878 1879 return float32_round_pack_canonical(pr, status); 1880 } 1881 1882 static float32 soft_f32_add(float32 a, float32 b, float_status *status) 1883 { 1884 return soft_f32_addsub(a, b, status, false); 1885 } 1886 1887 static float32 soft_f32_sub(float32 a, float32 b, float_status *status) 1888 { 1889 return soft_f32_addsub(a, b, status, true); 1890 } 1891 1892 static float64 QEMU_SOFTFLOAT_ATTR 1893 soft_f64_addsub(float64 a, float64 b, float_status *status, bool subtract) 1894 { 1895 FloatParts64 pa, pb, *pr; 1896 1897 float64_unpack_canonical(&pa, a, status); 1898 float64_unpack_canonical(&pb, b, status); 1899 pr = parts_addsub(&pa, &pb, status, subtract); 1900 1901 return float64_round_pack_canonical(pr, status); 1902 } 1903 1904 static float64 soft_f64_add(float64 a, float64 b, float_status *status) 1905 { 1906 return soft_f64_addsub(a, b, status, false); 1907 } 1908 1909 static float64 soft_f64_sub(float64 a, float64 b, float_status *status) 1910 { 1911 return soft_f64_addsub(a, b, status, true); 1912 } 1913 1914 static float hard_f32_add(float a, float b) 1915 { 1916 return a + b; 1917 } 1918 1919 static float hard_f32_sub(float a, float b) 1920 { 1921 return a - b; 1922 } 1923 1924 static double hard_f64_add(double a, double b) 1925 { 1926 return a + b; 1927 } 1928 1929 static double hard_f64_sub(double a, double b) 1930 { 1931 return a - b; 1932 } 1933 1934 static bool f32_addsubmul_post(union_float32 a, union_float32 b) 1935 { 1936 if (QEMU_HARDFLOAT_2F32_USE_FP) { 1937 return !(fpclassify(a.h) == FP_ZERO && fpclassify(b.h) == FP_ZERO); 1938 } 1939 return !(float32_is_zero(a.s) && float32_is_zero(b.s)); 1940 } 1941 1942 static bool f64_addsubmul_post(union_float64 a, union_float64 b) 1943 { 1944 if (QEMU_HARDFLOAT_2F64_USE_FP) { 1945 return !(fpclassify(a.h) == FP_ZERO && fpclassify(b.h) == FP_ZERO); 1946 } else { 1947 return !(float64_is_zero(a.s) && float64_is_zero(b.s)); 1948 } 1949 } 1950 1951 static float32 float32_addsub(float32 a, float32 b, float_status *s, 1952 hard_f32_op2_fn hard, soft_f32_op2_fn soft) 1953 { 1954 return float32_gen2(a, b, s, hard, soft, 1955 f32_is_zon2, f32_addsubmul_post); 1956 } 1957 1958 static float64 float64_addsub(float64 a, float64 b, float_status *s, 1959 hard_f64_op2_fn hard, soft_f64_op2_fn soft) 1960 { 1961 return float64_gen2(a, b, s, hard, soft, 1962 f64_is_zon2, f64_addsubmul_post); 1963 } 1964 1965 float32 QEMU_FLATTEN 1966 float32_add(float32 a, float32 b, float_status *s) 1967 { 1968 return float32_addsub(a, b, s, hard_f32_add, soft_f32_add); 1969 } 1970 1971 float32 QEMU_FLATTEN 1972 float32_sub(float32 a, float32 b, float_status *s) 1973 { 1974 return float32_addsub(a, b, s, hard_f32_sub, soft_f32_sub); 1975 } 1976 1977 float64 QEMU_FLATTEN 1978 float64_add(float64 a, float64 b, float_status *s) 1979 { 1980 return float64_addsub(a, b, s, hard_f64_add, soft_f64_add); 1981 } 1982 1983 float64 QEMU_FLATTEN 1984 float64_sub(float64 a, float64 b, float_status *s) 1985 { 1986 return float64_addsub(a, b, s, hard_f64_sub, soft_f64_sub); 1987 } 1988 1989 static float64 float64r32_addsub(float64 a, float64 b, float_status *status, 1990 bool subtract) 1991 { 1992 FloatParts64 pa, pb, *pr; 1993 1994 float64_unpack_canonical(&pa, a, status); 1995 float64_unpack_canonical(&pb, b, status); 1996 pr = parts_addsub(&pa, &pb, status, subtract); 1997 1998 return float64r32_round_pack_canonical(pr, status); 1999 } 2000 2001 float64 float64r32_add(float64 a, float64 b, float_status *status) 2002 { 2003 return float64r32_addsub(a, b, status, false); 2004 } 2005 2006 float64 float64r32_sub(float64 a, float64 b, float_status *status) 2007 { 2008 return float64r32_addsub(a, b, status, true); 2009 } 2010 2011 static bfloat16 QEMU_FLATTEN 2012 bfloat16_addsub(bfloat16 a, bfloat16 b, float_status *status, bool subtract) 2013 { 2014 FloatParts64 pa, pb, *pr; 2015 2016 bfloat16_unpack_canonical(&pa, a, status); 2017 bfloat16_unpack_canonical(&pb, b, status); 2018 pr = parts_addsub(&pa, &pb, status, subtract); 2019 2020 return bfloat16_round_pack_canonical(pr, status); 2021 } 2022 2023 bfloat16 bfloat16_add(bfloat16 a, bfloat16 b, float_status *status) 2024 { 2025 return bfloat16_addsub(a, b, status, false); 2026 } 2027 2028 bfloat16 bfloat16_sub(bfloat16 a, bfloat16 b, float_status *status) 2029 { 2030 return bfloat16_addsub(a, b, status, true); 2031 } 2032 2033 static float128 QEMU_FLATTEN 2034 float128_addsub(float128 a, float128 b, float_status *status, bool subtract) 2035 { 2036 FloatParts128 pa, pb, *pr; 2037 2038 float128_unpack_canonical(&pa, a, status); 2039 float128_unpack_canonical(&pb, b, status); 2040 pr = parts_addsub(&pa, &pb, status, subtract); 2041 2042 return float128_round_pack_canonical(pr, status); 2043 } 2044 2045 float128 float128_add(float128 a, float128 b, float_status *status) 2046 { 2047 return float128_addsub(a, b, status, false); 2048 } 2049 2050 float128 float128_sub(float128 a, float128 b, float_status *status) 2051 { 2052 return float128_addsub(a, b, status, true); 2053 } 2054 2055 static floatx80 QEMU_FLATTEN 2056 floatx80_addsub(floatx80 a, floatx80 b, float_status *status, bool subtract) 2057 { 2058 FloatParts128 pa, pb, *pr; 2059 2060 if (!floatx80_unpack_canonical(&pa, a, status) || 2061 !floatx80_unpack_canonical(&pb, b, status)) { 2062 return floatx80_default_nan(status); 2063 } 2064 2065 pr = parts_addsub(&pa, &pb, status, subtract); 2066 return floatx80_round_pack_canonical(pr, status); 2067 } 2068 2069 floatx80 floatx80_add(floatx80 a, floatx80 b, float_status *status) 2070 { 2071 return floatx80_addsub(a, b, status, false); 2072 } 2073 2074 floatx80 floatx80_sub(floatx80 a, floatx80 b, float_status *status) 2075 { 2076 return floatx80_addsub(a, b, status, true); 2077 } 2078 2079 /* 2080 * Multiplication 2081 */ 2082 2083 float16 QEMU_FLATTEN float16_mul(float16 a, float16 b, float_status *status) 2084 { 2085 FloatParts64 pa, pb, *pr; 2086 2087 float16_unpack_canonical(&pa, a, status); 2088 float16_unpack_canonical(&pb, b, status); 2089 pr = parts_mul(&pa, &pb, status); 2090 2091 return float16_round_pack_canonical(pr, status); 2092 } 2093 2094 static float32 QEMU_SOFTFLOAT_ATTR 2095 soft_f32_mul(float32 a, float32 b, float_status *status) 2096 { 2097 FloatParts64 pa, pb, *pr; 2098 2099 float32_unpack_canonical(&pa, a, status); 2100 float32_unpack_canonical(&pb, b, status); 2101 pr = parts_mul(&pa, &pb, status); 2102 2103 return float32_round_pack_canonical(pr, status); 2104 } 2105 2106 static float64 QEMU_SOFTFLOAT_ATTR 2107 soft_f64_mul(float64 a, float64 b, float_status *status) 2108 { 2109 FloatParts64 pa, pb, *pr; 2110 2111 float64_unpack_canonical(&pa, a, status); 2112 float64_unpack_canonical(&pb, b, status); 2113 pr = parts_mul(&pa, &pb, status); 2114 2115 return float64_round_pack_canonical(pr, status); 2116 } 2117 2118 static float hard_f32_mul(float a, float b) 2119 { 2120 return a * b; 2121 } 2122 2123 static double hard_f64_mul(double a, double b) 2124 { 2125 return a * b; 2126 } 2127 2128 float32 QEMU_FLATTEN 2129 float32_mul(float32 a, float32 b, float_status *s) 2130 { 2131 return float32_gen2(a, b, s, hard_f32_mul, soft_f32_mul, 2132 f32_is_zon2, f32_addsubmul_post); 2133 } 2134 2135 float64 QEMU_FLATTEN 2136 float64_mul(float64 a, float64 b, float_status *s) 2137 { 2138 return float64_gen2(a, b, s, hard_f64_mul, soft_f64_mul, 2139 f64_is_zon2, f64_addsubmul_post); 2140 } 2141 2142 float64 float64r32_mul(float64 a, float64 b, float_status *status) 2143 { 2144 FloatParts64 pa, pb, *pr; 2145 2146 float64_unpack_canonical(&pa, a, status); 2147 float64_unpack_canonical(&pb, b, status); 2148 pr = parts_mul(&pa, &pb, status); 2149 2150 return float64r32_round_pack_canonical(pr, status); 2151 } 2152 2153 bfloat16 QEMU_FLATTEN 2154 bfloat16_mul(bfloat16 a, bfloat16 b, float_status *status) 2155 { 2156 FloatParts64 pa, pb, *pr; 2157 2158 bfloat16_unpack_canonical(&pa, a, status); 2159 bfloat16_unpack_canonical(&pb, b, status); 2160 pr = parts_mul(&pa, &pb, status); 2161 2162 return bfloat16_round_pack_canonical(pr, status); 2163 } 2164 2165 float128 QEMU_FLATTEN 2166 float128_mul(float128 a, float128 b, float_status *status) 2167 { 2168 FloatParts128 pa, pb, *pr; 2169 2170 float128_unpack_canonical(&pa, a, status); 2171 float128_unpack_canonical(&pb, b, status); 2172 pr = parts_mul(&pa, &pb, status); 2173 2174 return float128_round_pack_canonical(pr, status); 2175 } 2176 2177 floatx80 QEMU_FLATTEN 2178 floatx80_mul(floatx80 a, floatx80 b, float_status *status) 2179 { 2180 FloatParts128 pa, pb, *pr; 2181 2182 if (!floatx80_unpack_canonical(&pa, a, status) || 2183 !floatx80_unpack_canonical(&pb, b, status)) { 2184 return floatx80_default_nan(status); 2185 } 2186 2187 pr = parts_mul(&pa, &pb, status); 2188 return floatx80_round_pack_canonical(pr, status); 2189 } 2190 2191 /* 2192 * Fused multiply-add 2193 */ 2194 2195 float16 QEMU_FLATTEN float16_muladd(float16 a, float16 b, float16 c, 2196 int flags, float_status *status) 2197 { 2198 FloatParts64 pa, pb, pc, *pr; 2199 2200 float16_unpack_canonical(&pa, a, status); 2201 float16_unpack_canonical(&pb, b, status); 2202 float16_unpack_canonical(&pc, c, status); 2203 pr = parts_muladd(&pa, &pb, &pc, flags, status); 2204 2205 return float16_round_pack_canonical(pr, status); 2206 } 2207 2208 static float32 QEMU_SOFTFLOAT_ATTR 2209 soft_f32_muladd(float32 a, float32 b, float32 c, int flags, 2210 float_status *status) 2211 { 2212 FloatParts64 pa, pb, pc, *pr; 2213 2214 float32_unpack_canonical(&pa, a, status); 2215 float32_unpack_canonical(&pb, b, status); 2216 float32_unpack_canonical(&pc, c, status); 2217 pr = parts_muladd(&pa, &pb, &pc, flags, status); 2218 2219 return float32_round_pack_canonical(pr, status); 2220 } 2221 2222 static float64 QEMU_SOFTFLOAT_ATTR 2223 soft_f64_muladd(float64 a, float64 b, float64 c, int flags, 2224 float_status *status) 2225 { 2226 FloatParts64 pa, pb, pc, *pr; 2227 2228 float64_unpack_canonical(&pa, a, status); 2229 float64_unpack_canonical(&pb, b, status); 2230 float64_unpack_canonical(&pc, c, status); 2231 pr = parts_muladd(&pa, &pb, &pc, flags, status); 2232 2233 return float64_round_pack_canonical(pr, status); 2234 } 2235 2236 static bool force_soft_fma; 2237 2238 float32 QEMU_FLATTEN 2239 float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s) 2240 { 2241 union_float32 ua, ub, uc, ur; 2242 2243 ua.s = xa; 2244 ub.s = xb; 2245 uc.s = xc; 2246 2247 if (unlikely(!can_use_fpu(s))) { 2248 goto soft; 2249 } 2250 if (unlikely(flags & float_muladd_halve_result)) { 2251 goto soft; 2252 } 2253 2254 float32_input_flush3(&ua.s, &ub.s, &uc.s, s); 2255 if (unlikely(!f32_is_zon3(ua, ub, uc))) { 2256 goto soft; 2257 } 2258 2259 if (unlikely(force_soft_fma)) { 2260 goto soft; 2261 } 2262 2263 /* 2264 * When (a || b) == 0, there's no need to check for under/over flow, 2265 * since we know the addend is (normal || 0) and the product is 0. 2266 */ 2267 if (float32_is_zero(ua.s) || float32_is_zero(ub.s)) { 2268 union_float32 up; 2269 bool prod_sign; 2270 2271 prod_sign = float32_is_neg(ua.s) ^ float32_is_neg(ub.s); 2272 prod_sign ^= !!(flags & float_muladd_negate_product); 2273 up.s = float32_set_sign(float32_zero, prod_sign); 2274 2275 if (flags & float_muladd_negate_c) { 2276 uc.h = -uc.h; 2277 } 2278 ur.h = up.h + uc.h; 2279 } else { 2280 union_float32 ua_orig = ua; 2281 union_float32 uc_orig = uc; 2282 2283 if (flags & float_muladd_negate_product) { 2284 ua.h = -ua.h; 2285 } 2286 if (flags & float_muladd_negate_c) { 2287 uc.h = -uc.h; 2288 } 2289 2290 ur.h = fmaf(ua.h, ub.h, uc.h); 2291 2292 if (unlikely(f32_is_inf(ur))) { 2293 float_raise(float_flag_overflow, s); 2294 } else if (unlikely(fabsf(ur.h) <= FLT_MIN)) { 2295 ua = ua_orig; 2296 uc = uc_orig; 2297 goto soft; 2298 } 2299 } 2300 if (flags & float_muladd_negate_result) { 2301 return float32_chs(ur.s); 2302 } 2303 return ur.s; 2304 2305 soft: 2306 return soft_f32_muladd(ua.s, ub.s, uc.s, flags, s); 2307 } 2308 2309 float64 QEMU_FLATTEN 2310 float64_muladd(float64 xa, float64 xb, float64 xc, int flags, float_status *s) 2311 { 2312 union_float64 ua, ub, uc, ur; 2313 2314 ua.s = xa; 2315 ub.s = xb; 2316 uc.s = xc; 2317 2318 if (unlikely(!can_use_fpu(s))) { 2319 goto soft; 2320 } 2321 if (unlikely(flags & float_muladd_halve_result)) { 2322 goto soft; 2323 } 2324 2325 float64_input_flush3(&ua.s, &ub.s, &uc.s, s); 2326 if (unlikely(!f64_is_zon3(ua, ub, uc))) { 2327 goto soft; 2328 } 2329 2330 if (unlikely(force_soft_fma)) { 2331 goto soft; 2332 } 2333 2334 /* 2335 * When (a || b) == 0, there's no need to check for under/over flow, 2336 * since we know the addend is (normal || 0) and the product is 0. 2337 */ 2338 if (float64_is_zero(ua.s) || float64_is_zero(ub.s)) { 2339 union_float64 up; 2340 bool prod_sign; 2341 2342 prod_sign = float64_is_neg(ua.s) ^ float64_is_neg(ub.s); 2343 prod_sign ^= !!(flags & float_muladd_negate_product); 2344 up.s = float64_set_sign(float64_zero, prod_sign); 2345 2346 if (flags & float_muladd_negate_c) { 2347 uc.h = -uc.h; 2348 } 2349 ur.h = up.h + uc.h; 2350 } else { 2351 union_float64 ua_orig = ua; 2352 union_float64 uc_orig = uc; 2353 2354 if (flags & float_muladd_negate_product) { 2355 ua.h = -ua.h; 2356 } 2357 if (flags & float_muladd_negate_c) { 2358 uc.h = -uc.h; 2359 } 2360 2361 ur.h = fma(ua.h, ub.h, uc.h); 2362 2363 if (unlikely(f64_is_inf(ur))) { 2364 float_raise(float_flag_overflow, s); 2365 } else if (unlikely(fabs(ur.h) <= FLT_MIN)) { 2366 ua = ua_orig; 2367 uc = uc_orig; 2368 goto soft; 2369 } 2370 } 2371 if (flags & float_muladd_negate_result) { 2372 return float64_chs(ur.s); 2373 } 2374 return ur.s; 2375 2376 soft: 2377 return soft_f64_muladd(ua.s, ub.s, uc.s, flags, s); 2378 } 2379 2380 float64 float64r32_muladd(float64 a, float64 b, float64 c, 2381 int flags, float_status *status) 2382 { 2383 FloatParts64 pa, pb, pc, *pr; 2384 2385 float64_unpack_canonical(&pa, a, status); 2386 float64_unpack_canonical(&pb, b, status); 2387 float64_unpack_canonical(&pc, c, status); 2388 pr = parts_muladd(&pa, &pb, &pc, flags, status); 2389 2390 return float64r32_round_pack_canonical(pr, status); 2391 } 2392 2393 bfloat16 QEMU_FLATTEN bfloat16_muladd(bfloat16 a, bfloat16 b, bfloat16 c, 2394 int flags, float_status *status) 2395 { 2396 FloatParts64 pa, pb, pc, *pr; 2397 2398 bfloat16_unpack_canonical(&pa, a, status); 2399 bfloat16_unpack_canonical(&pb, b, status); 2400 bfloat16_unpack_canonical(&pc, c, status); 2401 pr = parts_muladd(&pa, &pb, &pc, flags, status); 2402 2403 return bfloat16_round_pack_canonical(pr, status); 2404 } 2405 2406 float128 QEMU_FLATTEN float128_muladd(float128 a, float128 b, float128 c, 2407 int flags, float_status *status) 2408 { 2409 FloatParts128 pa, pb, pc, *pr; 2410 2411 float128_unpack_canonical(&pa, a, status); 2412 float128_unpack_canonical(&pb, b, status); 2413 float128_unpack_canonical(&pc, c, status); 2414 pr = parts_muladd(&pa, &pb, &pc, flags, status); 2415 2416 return float128_round_pack_canonical(pr, status); 2417 } 2418 2419 /* 2420 * Division 2421 */ 2422 2423 float16 float16_div(float16 a, float16 b, float_status *status) 2424 { 2425 FloatParts64 pa, pb, *pr; 2426 2427 float16_unpack_canonical(&pa, a, status); 2428 float16_unpack_canonical(&pb, b, status); 2429 pr = parts_div(&pa, &pb, status); 2430 2431 return float16_round_pack_canonical(pr, status); 2432 } 2433 2434 static float32 QEMU_SOFTFLOAT_ATTR 2435 soft_f32_div(float32 a, float32 b, float_status *status) 2436 { 2437 FloatParts64 pa, pb, *pr; 2438 2439 float32_unpack_canonical(&pa, a, status); 2440 float32_unpack_canonical(&pb, b, status); 2441 pr = parts_div(&pa, &pb, status); 2442 2443 return float32_round_pack_canonical(pr, status); 2444 } 2445 2446 static float64 QEMU_SOFTFLOAT_ATTR 2447 soft_f64_div(float64 a, float64 b, float_status *status) 2448 { 2449 FloatParts64 pa, pb, *pr; 2450 2451 float64_unpack_canonical(&pa, a, status); 2452 float64_unpack_canonical(&pb, b, status); 2453 pr = parts_div(&pa, &pb, status); 2454 2455 return float64_round_pack_canonical(pr, status); 2456 } 2457 2458 static float hard_f32_div(float a, float b) 2459 { 2460 return a / b; 2461 } 2462 2463 static double hard_f64_div(double a, double b) 2464 { 2465 return a / b; 2466 } 2467 2468 static bool f32_div_pre(union_float32 a, union_float32 b) 2469 { 2470 if (QEMU_HARDFLOAT_2F32_USE_FP) { 2471 return (fpclassify(a.h) == FP_NORMAL || fpclassify(a.h) == FP_ZERO) && 2472 fpclassify(b.h) == FP_NORMAL; 2473 } 2474 return float32_is_zero_or_normal(a.s) && float32_is_normal(b.s); 2475 } 2476 2477 static bool f64_div_pre(union_float64 a, union_float64 b) 2478 { 2479 if (QEMU_HARDFLOAT_2F64_USE_FP) { 2480 return (fpclassify(a.h) == FP_NORMAL || fpclassify(a.h) == FP_ZERO) && 2481 fpclassify(b.h) == FP_NORMAL; 2482 } 2483 return float64_is_zero_or_normal(a.s) && float64_is_normal(b.s); 2484 } 2485 2486 static bool f32_div_post(union_float32 a, union_float32 b) 2487 { 2488 if (QEMU_HARDFLOAT_2F32_USE_FP) { 2489 return fpclassify(a.h) != FP_ZERO; 2490 } 2491 return !float32_is_zero(a.s); 2492 } 2493 2494 static bool f64_div_post(union_float64 a, union_float64 b) 2495 { 2496 if (QEMU_HARDFLOAT_2F64_USE_FP) { 2497 return fpclassify(a.h) != FP_ZERO; 2498 } 2499 return !float64_is_zero(a.s); 2500 } 2501 2502 float32 QEMU_FLATTEN 2503 float32_div(float32 a, float32 b, float_status *s) 2504 { 2505 return float32_gen2(a, b, s, hard_f32_div, soft_f32_div, 2506 f32_div_pre, f32_div_post); 2507 } 2508 2509 float64 QEMU_FLATTEN 2510 float64_div(float64 a, float64 b, float_status *s) 2511 { 2512 return float64_gen2(a, b, s, hard_f64_div, soft_f64_div, 2513 f64_div_pre, f64_div_post); 2514 } 2515 2516 float64 float64r32_div(float64 a, float64 b, float_status *status) 2517 { 2518 FloatParts64 pa, pb, *pr; 2519 2520 float64_unpack_canonical(&pa, a, status); 2521 float64_unpack_canonical(&pb, b, status); 2522 pr = parts_div(&pa, &pb, status); 2523 2524 return float64r32_round_pack_canonical(pr, status); 2525 } 2526 2527 bfloat16 QEMU_FLATTEN 2528 bfloat16_div(bfloat16 a, bfloat16 b, float_status *status) 2529 { 2530 FloatParts64 pa, pb, *pr; 2531 2532 bfloat16_unpack_canonical(&pa, a, status); 2533 bfloat16_unpack_canonical(&pb, b, status); 2534 pr = parts_div(&pa, &pb, status); 2535 2536 return bfloat16_round_pack_canonical(pr, status); 2537 } 2538 2539 float128 QEMU_FLATTEN 2540 float128_div(float128 a, float128 b, float_status *status) 2541 { 2542 FloatParts128 pa, pb, *pr; 2543 2544 float128_unpack_canonical(&pa, a, status); 2545 float128_unpack_canonical(&pb, b, status); 2546 pr = parts_div(&pa, &pb, status); 2547 2548 return float128_round_pack_canonical(pr, status); 2549 } 2550 2551 floatx80 floatx80_div(floatx80 a, floatx80 b, float_status *status) 2552 { 2553 FloatParts128 pa, pb, *pr; 2554 2555 if (!floatx80_unpack_canonical(&pa, a, status) || 2556 !floatx80_unpack_canonical(&pb, b, status)) { 2557 return floatx80_default_nan(status); 2558 } 2559 2560 pr = parts_div(&pa, &pb, status); 2561 return floatx80_round_pack_canonical(pr, status); 2562 } 2563 2564 /* 2565 * Remainder 2566 */ 2567 2568 float32 float32_rem(float32 a, float32 b, float_status *status) 2569 { 2570 FloatParts64 pa, pb, *pr; 2571 2572 float32_unpack_canonical(&pa, a, status); 2573 float32_unpack_canonical(&pb, b, status); 2574 pr = parts_modrem(&pa, &pb, NULL, status); 2575 2576 return float32_round_pack_canonical(pr, status); 2577 } 2578 2579 float64 float64_rem(float64 a, float64 b, float_status *status) 2580 { 2581 FloatParts64 pa, pb, *pr; 2582 2583 float64_unpack_canonical(&pa, a, status); 2584 float64_unpack_canonical(&pb, b, status); 2585 pr = parts_modrem(&pa, &pb, NULL, status); 2586 2587 return float64_round_pack_canonical(pr, status); 2588 } 2589 2590 float128 float128_rem(float128 a, float128 b, float_status *status) 2591 { 2592 FloatParts128 pa, pb, *pr; 2593 2594 float128_unpack_canonical(&pa, a, status); 2595 float128_unpack_canonical(&pb, b, status); 2596 pr = parts_modrem(&pa, &pb, NULL, status); 2597 2598 return float128_round_pack_canonical(pr, status); 2599 } 2600 2601 /* 2602 * Returns the remainder of the extended double-precision floating-point value 2603 * `a' with respect to the corresponding value `b'. 2604 * If 'mod' is false, the operation is performed according to the IEC/IEEE 2605 * Standard for Binary Floating-Point Arithmetic. If 'mod' is true, return 2606 * the remainder based on truncating the quotient toward zero instead and 2607 * *quotient is set to the low 64 bits of the absolute value of the integer 2608 * quotient. 2609 */ 2610 floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod, 2611 uint64_t *quotient, float_status *status) 2612 { 2613 FloatParts128 pa, pb, *pr; 2614 2615 *quotient = 0; 2616 if (!floatx80_unpack_canonical(&pa, a, status) || 2617 !floatx80_unpack_canonical(&pb, b, status)) { 2618 return floatx80_default_nan(status); 2619 } 2620 pr = parts_modrem(&pa, &pb, mod ? quotient : NULL, status); 2621 2622 return floatx80_round_pack_canonical(pr, status); 2623 } 2624 2625 floatx80 floatx80_rem(floatx80 a, floatx80 b, float_status *status) 2626 { 2627 uint64_t quotient; 2628 return floatx80_modrem(a, b, false, "ient, status); 2629 } 2630 2631 floatx80 floatx80_mod(floatx80 a, floatx80 b, float_status *status) 2632 { 2633 uint64_t quotient; 2634 return floatx80_modrem(a, b, true, "ient, status); 2635 } 2636 2637 /* 2638 * Float to Float conversions 2639 * 2640 * Returns the result of converting one float format to another. The 2641 * conversion is performed according to the IEC/IEEE Standard for 2642 * Binary Floating-Point Arithmetic. 2643 * 2644 * Usually this only needs to take care of raising invalid exceptions 2645 * and handling the conversion on NaNs. 2646 */ 2647 2648 static void parts_float_to_ahp(FloatParts64 *a, float_status *s) 2649 { 2650 switch (a->cls) { 2651 case float_class_snan: 2652 float_raise(float_flag_invalid_snan, s); 2653 /* fall through */ 2654 case float_class_qnan: 2655 /* 2656 * There is no NaN in the destination format. Raise Invalid 2657 * and return a zero with the sign of the input NaN. 2658 */ 2659 float_raise(float_flag_invalid, s); 2660 a->cls = float_class_zero; 2661 break; 2662 2663 case float_class_inf: 2664 /* 2665 * There is no Inf in the destination format. Raise Invalid 2666 * and return the maximum normal with the correct sign. 2667 */ 2668 float_raise(float_flag_invalid, s); 2669 a->cls = float_class_normal; 2670 a->exp = float16_params_ahp.exp_max; 2671 a->frac = MAKE_64BIT_MASK(float16_params_ahp.frac_shift, 2672 float16_params_ahp.frac_size + 1); 2673 break; 2674 2675 case float_class_normal: 2676 case float_class_zero: 2677 break; 2678 2679 default: 2680 g_assert_not_reached(); 2681 } 2682 } 2683 2684 static void parts64_float_to_float(FloatParts64 *a, float_status *s) 2685 { 2686 if (is_nan(a->cls)) { 2687 parts_return_nan(a, s); 2688 } 2689 } 2690 2691 static void parts128_float_to_float(FloatParts128 *a, float_status *s) 2692 { 2693 if (is_nan(a->cls)) { 2694 parts_return_nan(a, s); 2695 } 2696 } 2697 2698 #define parts_float_to_float(P, S) \ 2699 PARTS_GENERIC_64_128(float_to_float, P)(P, S) 2700 2701 static void parts_float_to_float_narrow(FloatParts64 *a, FloatParts128 *b, 2702 float_status *s) 2703 { 2704 a->cls = b->cls; 2705 a->sign = b->sign; 2706 a->exp = b->exp; 2707 2708 if (a->cls == float_class_normal) { 2709 frac_truncjam(a, b); 2710 } else if (is_nan(a->cls)) { 2711 /* Discard the low bits of the NaN. */ 2712 a->frac = b->frac_hi; 2713 parts_return_nan(a, s); 2714 } 2715 } 2716 2717 static void parts_float_to_float_widen(FloatParts128 *a, FloatParts64 *b, 2718 float_status *s) 2719 { 2720 a->cls = b->cls; 2721 a->sign = b->sign; 2722 a->exp = b->exp; 2723 frac_widen(a, b); 2724 2725 if (is_nan(a->cls)) { 2726 parts_return_nan(a, s); 2727 } 2728 } 2729 2730 float32 float16_to_float32(float16 a, bool ieee, float_status *s) 2731 { 2732 const FloatFmt *fmt16 = ieee ? &float16_params : &float16_params_ahp; 2733 FloatParts64 p; 2734 2735 float16a_unpack_canonical(&p, a, s, fmt16); 2736 parts_float_to_float(&p, s); 2737 return float32_round_pack_canonical(&p, s); 2738 } 2739 2740 float64 float16_to_float64(float16 a, bool ieee, float_status *s) 2741 { 2742 const FloatFmt *fmt16 = ieee ? &float16_params : &float16_params_ahp; 2743 FloatParts64 p; 2744 2745 float16a_unpack_canonical(&p, a, s, fmt16); 2746 parts_float_to_float(&p, s); 2747 return float64_round_pack_canonical(&p, s); 2748 } 2749 2750 float16 float32_to_float16(float32 a, bool ieee, float_status *s) 2751 { 2752 FloatParts64 p; 2753 const FloatFmt *fmt; 2754 2755 float32_unpack_canonical(&p, a, s); 2756 if (ieee) { 2757 parts_float_to_float(&p, s); 2758 fmt = &float16_params; 2759 } else { 2760 parts_float_to_ahp(&p, s); 2761 fmt = &float16_params_ahp; 2762 } 2763 return float16a_round_pack_canonical(&p, s, fmt); 2764 } 2765 2766 static float64 QEMU_SOFTFLOAT_ATTR 2767 soft_float32_to_float64(float32 a, float_status *s) 2768 { 2769 FloatParts64 p; 2770 2771 float32_unpack_canonical(&p, a, s); 2772 parts_float_to_float(&p, s); 2773 return float64_round_pack_canonical(&p, s); 2774 } 2775 2776 float64 float32_to_float64(float32 a, float_status *s) 2777 { 2778 if (likely(float32_is_normal(a))) { 2779 /* Widening conversion can never produce inexact results. */ 2780 union_float32 uf; 2781 union_float64 ud; 2782 uf.s = a; 2783 ud.h = uf.h; 2784 return ud.s; 2785 } else if (float32_is_zero(a)) { 2786 return float64_set_sign(float64_zero, float32_is_neg(a)); 2787 } else { 2788 return soft_float32_to_float64(a, s); 2789 } 2790 } 2791 2792 float16 float64_to_float16(float64 a, bool ieee, float_status *s) 2793 { 2794 FloatParts64 p; 2795 const FloatFmt *fmt; 2796 2797 float64_unpack_canonical(&p, a, s); 2798 if (ieee) { 2799 parts_float_to_float(&p, s); 2800 fmt = &float16_params; 2801 } else { 2802 parts_float_to_ahp(&p, s); 2803 fmt = &float16_params_ahp; 2804 } 2805 return float16a_round_pack_canonical(&p, s, fmt); 2806 } 2807 2808 float32 float64_to_float32(float64 a, float_status *s) 2809 { 2810 FloatParts64 p; 2811 2812 float64_unpack_canonical(&p, a, s); 2813 parts_float_to_float(&p, s); 2814 return float32_round_pack_canonical(&p, s); 2815 } 2816 2817 float32 bfloat16_to_float32(bfloat16 a, float_status *s) 2818 { 2819 FloatParts64 p; 2820 2821 bfloat16_unpack_canonical(&p, a, s); 2822 parts_float_to_float(&p, s); 2823 return float32_round_pack_canonical(&p, s); 2824 } 2825 2826 float64 bfloat16_to_float64(bfloat16 a, float_status *s) 2827 { 2828 FloatParts64 p; 2829 2830 bfloat16_unpack_canonical(&p, a, s); 2831 parts_float_to_float(&p, s); 2832 return float64_round_pack_canonical(&p, s); 2833 } 2834 2835 bfloat16 float32_to_bfloat16(float32 a, float_status *s) 2836 { 2837 FloatParts64 p; 2838 2839 float32_unpack_canonical(&p, a, s); 2840 parts_float_to_float(&p, s); 2841 return bfloat16_round_pack_canonical(&p, s); 2842 } 2843 2844 bfloat16 float64_to_bfloat16(float64 a, float_status *s) 2845 { 2846 FloatParts64 p; 2847 2848 float64_unpack_canonical(&p, a, s); 2849 parts_float_to_float(&p, s); 2850 return bfloat16_round_pack_canonical(&p, s); 2851 } 2852 2853 float32 float128_to_float32(float128 a, float_status *s) 2854 { 2855 FloatParts64 p64; 2856 FloatParts128 p128; 2857 2858 float128_unpack_canonical(&p128, a, s); 2859 parts_float_to_float_narrow(&p64, &p128, s); 2860 return float32_round_pack_canonical(&p64, s); 2861 } 2862 2863 float64 float128_to_float64(float128 a, float_status *s) 2864 { 2865 FloatParts64 p64; 2866 FloatParts128 p128; 2867 2868 float128_unpack_canonical(&p128, a, s); 2869 parts_float_to_float_narrow(&p64, &p128, s); 2870 return float64_round_pack_canonical(&p64, s); 2871 } 2872 2873 float128 float32_to_float128(float32 a, float_status *s) 2874 { 2875 FloatParts64 p64; 2876 FloatParts128 p128; 2877 2878 float32_unpack_canonical(&p64, a, s); 2879 parts_float_to_float_widen(&p128, &p64, s); 2880 return float128_round_pack_canonical(&p128, s); 2881 } 2882 2883 float128 float64_to_float128(float64 a, float_status *s) 2884 { 2885 FloatParts64 p64; 2886 FloatParts128 p128; 2887 2888 float64_unpack_canonical(&p64, a, s); 2889 parts_float_to_float_widen(&p128, &p64, s); 2890 return float128_round_pack_canonical(&p128, s); 2891 } 2892 2893 float32 floatx80_to_float32(floatx80 a, float_status *s) 2894 { 2895 FloatParts64 p64; 2896 FloatParts128 p128; 2897 2898 if (floatx80_unpack_canonical(&p128, a, s)) { 2899 parts_float_to_float_narrow(&p64, &p128, s); 2900 } else { 2901 parts_default_nan(&p64, s); 2902 } 2903 return float32_round_pack_canonical(&p64, s); 2904 } 2905 2906 float64 floatx80_to_float64(floatx80 a, float_status *s) 2907 { 2908 FloatParts64 p64; 2909 FloatParts128 p128; 2910 2911 if (floatx80_unpack_canonical(&p128, a, s)) { 2912 parts_float_to_float_narrow(&p64, &p128, s); 2913 } else { 2914 parts_default_nan(&p64, s); 2915 } 2916 return float64_round_pack_canonical(&p64, s); 2917 } 2918 2919 float128 floatx80_to_float128(floatx80 a, float_status *s) 2920 { 2921 FloatParts128 p; 2922 2923 if (floatx80_unpack_canonical(&p, a, s)) { 2924 parts_float_to_float(&p, s); 2925 } else { 2926 parts_default_nan(&p, s); 2927 } 2928 return float128_round_pack_canonical(&p, s); 2929 } 2930 2931 floatx80 float32_to_floatx80(float32 a, float_status *s) 2932 { 2933 FloatParts64 p64; 2934 FloatParts128 p128; 2935 2936 float32_unpack_canonical(&p64, a, s); 2937 parts_float_to_float_widen(&p128, &p64, s); 2938 return floatx80_round_pack_canonical(&p128, s); 2939 } 2940 2941 floatx80 float64_to_floatx80(float64 a, float_status *s) 2942 { 2943 FloatParts64 p64; 2944 FloatParts128 p128; 2945 2946 float64_unpack_canonical(&p64, a, s); 2947 parts_float_to_float_widen(&p128, &p64, s); 2948 return floatx80_round_pack_canonical(&p128, s); 2949 } 2950 2951 floatx80 float128_to_floatx80(float128 a, float_status *s) 2952 { 2953 FloatParts128 p; 2954 2955 float128_unpack_canonical(&p, a, s); 2956 parts_float_to_float(&p, s); 2957 return floatx80_round_pack_canonical(&p, s); 2958 } 2959 2960 /* 2961 * Round to integral value 2962 */ 2963 2964 float16 float16_round_to_int(float16 a, float_status *s) 2965 { 2966 FloatParts64 p; 2967 2968 float16_unpack_canonical(&p, a, s); 2969 parts_round_to_int(&p, s->float_rounding_mode, 0, s, &float16_params); 2970 return float16_round_pack_canonical(&p, s); 2971 } 2972 2973 float32 float32_round_to_int(float32 a, float_status *s) 2974 { 2975 FloatParts64 p; 2976 2977 float32_unpack_canonical(&p, a, s); 2978 parts_round_to_int(&p, s->float_rounding_mode, 0, s, &float32_params); 2979 return float32_round_pack_canonical(&p, s); 2980 } 2981 2982 float64 float64_round_to_int(float64 a, float_status *s) 2983 { 2984 FloatParts64 p; 2985 2986 float64_unpack_canonical(&p, a, s); 2987 parts_round_to_int(&p, s->float_rounding_mode, 0, s, &float64_params); 2988 return float64_round_pack_canonical(&p, s); 2989 } 2990 2991 bfloat16 bfloat16_round_to_int(bfloat16 a, float_status *s) 2992 { 2993 FloatParts64 p; 2994 2995 bfloat16_unpack_canonical(&p, a, s); 2996 parts_round_to_int(&p, s->float_rounding_mode, 0, s, &bfloat16_params); 2997 return bfloat16_round_pack_canonical(&p, s); 2998 } 2999 3000 float128 float128_round_to_int(float128 a, float_status *s) 3001 { 3002 FloatParts128 p; 3003 3004 float128_unpack_canonical(&p, a, s); 3005 parts_round_to_int(&p, s->float_rounding_mode, 0, s, &float128_params); 3006 return float128_round_pack_canonical(&p, s); 3007 } 3008 3009 floatx80 floatx80_round_to_int(floatx80 a, float_status *status) 3010 { 3011 FloatParts128 p; 3012 3013 if (!floatx80_unpack_canonical(&p, a, status)) { 3014 return floatx80_default_nan(status); 3015 } 3016 3017 parts_round_to_int(&p, status->float_rounding_mode, 0, status, 3018 &floatx80_params[status->floatx80_rounding_precision]); 3019 return floatx80_round_pack_canonical(&p, status); 3020 } 3021 3022 /* 3023 * Floating-point to signed integer conversions 3024 */ 3025 3026 int8_t float16_to_int8_scalbn(float16 a, FloatRoundMode rmode, int scale, 3027 float_status *s) 3028 { 3029 FloatParts64 p; 3030 3031 float16_unpack_canonical(&p, a, s); 3032 return parts_float_to_sint(&p, rmode, scale, INT8_MIN, INT8_MAX, s); 3033 } 3034 3035 int16_t float16_to_int16_scalbn(float16 a, FloatRoundMode rmode, int scale, 3036 float_status *s) 3037 { 3038 FloatParts64 p; 3039 3040 float16_unpack_canonical(&p, a, s); 3041 return parts_float_to_sint(&p, rmode, scale, INT16_MIN, INT16_MAX, s); 3042 } 3043 3044 int32_t float16_to_int32_scalbn(float16 a, FloatRoundMode rmode, int scale, 3045 float_status *s) 3046 { 3047 FloatParts64 p; 3048 3049 float16_unpack_canonical(&p, a, s); 3050 return parts_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s); 3051 } 3052 3053 int64_t float16_to_int64_scalbn(float16 a, FloatRoundMode rmode, int scale, 3054 float_status *s) 3055 { 3056 FloatParts64 p; 3057 3058 float16_unpack_canonical(&p, a, s); 3059 return parts_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s); 3060 } 3061 3062 int16_t float32_to_int16_scalbn(float32 a, FloatRoundMode rmode, int scale, 3063 float_status *s) 3064 { 3065 FloatParts64 p; 3066 3067 float32_unpack_canonical(&p, a, s); 3068 return parts_float_to_sint(&p, rmode, scale, INT16_MIN, INT16_MAX, s); 3069 } 3070 3071 int32_t float32_to_int32_scalbn(float32 a, FloatRoundMode rmode, int scale, 3072 float_status *s) 3073 { 3074 FloatParts64 p; 3075 3076 float32_unpack_canonical(&p, a, s); 3077 return parts_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s); 3078 } 3079 3080 int64_t float32_to_int64_scalbn(float32 a, FloatRoundMode rmode, int scale, 3081 float_status *s) 3082 { 3083 FloatParts64 p; 3084 3085 float32_unpack_canonical(&p, a, s); 3086 return parts_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s); 3087 } 3088 3089 int16_t float64_to_int16_scalbn(float64 a, FloatRoundMode rmode, int scale, 3090 float_status *s) 3091 { 3092 FloatParts64 p; 3093 3094 float64_unpack_canonical(&p, a, s); 3095 return parts_float_to_sint(&p, rmode, scale, INT16_MIN, INT16_MAX, s); 3096 } 3097 3098 int32_t float64_to_int32_scalbn(float64 a, FloatRoundMode rmode, int scale, 3099 float_status *s) 3100 { 3101 FloatParts64 p; 3102 3103 float64_unpack_canonical(&p, a, s); 3104 return parts_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s); 3105 } 3106 3107 int64_t float64_to_int64_scalbn(float64 a, FloatRoundMode rmode, int scale, 3108 float_status *s) 3109 { 3110 FloatParts64 p; 3111 3112 float64_unpack_canonical(&p, a, s); 3113 return parts_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s); 3114 } 3115 3116 int16_t bfloat16_to_int16_scalbn(bfloat16 a, FloatRoundMode rmode, int scale, 3117 float_status *s) 3118 { 3119 FloatParts64 p; 3120 3121 bfloat16_unpack_canonical(&p, a, s); 3122 return parts_float_to_sint(&p, rmode, scale, INT16_MIN, INT16_MAX, s); 3123 } 3124 3125 int32_t bfloat16_to_int32_scalbn(bfloat16 a, FloatRoundMode rmode, int scale, 3126 float_status *s) 3127 { 3128 FloatParts64 p; 3129 3130 bfloat16_unpack_canonical(&p, a, s); 3131 return parts_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s); 3132 } 3133 3134 int64_t bfloat16_to_int64_scalbn(bfloat16 a, FloatRoundMode rmode, int scale, 3135 float_status *s) 3136 { 3137 FloatParts64 p; 3138 3139 bfloat16_unpack_canonical(&p, a, s); 3140 return parts_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s); 3141 } 3142 3143 static int32_t float128_to_int32_scalbn(float128 a, FloatRoundMode rmode, 3144 int scale, float_status *s) 3145 { 3146 FloatParts128 p; 3147 3148 float128_unpack_canonical(&p, a, s); 3149 return parts_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s); 3150 } 3151 3152 static int64_t float128_to_int64_scalbn(float128 a, FloatRoundMode rmode, 3153 int scale, float_status *s) 3154 { 3155 FloatParts128 p; 3156 3157 float128_unpack_canonical(&p, a, s); 3158 return parts_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s); 3159 } 3160 3161 static Int128 float128_to_int128_scalbn(float128 a, FloatRoundMode rmode, 3162 int scale, float_status *s) 3163 { 3164 int flags = 0; 3165 Int128 r; 3166 FloatParts128 p; 3167 3168 float128_unpack_canonical(&p, a, s); 3169 3170 switch (p.cls) { 3171 case float_class_snan: 3172 flags |= float_flag_invalid_snan; 3173 /* fall through */ 3174 case float_class_qnan: 3175 flags |= float_flag_invalid; 3176 r = UINT128_MAX; 3177 break; 3178 3179 case float_class_inf: 3180 flags = float_flag_invalid | float_flag_invalid_cvti; 3181 r = p.sign ? INT128_MIN : INT128_MAX; 3182 break; 3183 3184 case float_class_zero: 3185 return int128_zero(); 3186 3187 case float_class_normal: 3188 if (parts_round_to_int_normal(&p, rmode, scale, 128 - 2)) { 3189 flags = float_flag_inexact; 3190 } 3191 3192 if (p.exp < 127) { 3193 int shift = 127 - p.exp; 3194 r = int128_urshift(int128_make128(p.frac_lo, p.frac_hi), shift); 3195 if (p.sign) { 3196 r = int128_neg(r); 3197 } 3198 } else if (p.exp == 127 && p.sign && p.frac_lo == 0 && 3199 p.frac_hi == DECOMPOSED_IMPLICIT_BIT) { 3200 r = INT128_MIN; 3201 } else { 3202 flags = float_flag_invalid | float_flag_invalid_cvti; 3203 r = p.sign ? INT128_MIN : INT128_MAX; 3204 } 3205 break; 3206 3207 default: 3208 g_assert_not_reached(); 3209 } 3210 3211 float_raise(flags, s); 3212 return r; 3213 } 3214 3215 static int32_t floatx80_to_int32_scalbn(floatx80 a, FloatRoundMode rmode, 3216 int scale, float_status *s) 3217 { 3218 FloatParts128 p; 3219 3220 if (!floatx80_unpack_canonical(&p, a, s)) { 3221 parts_default_nan(&p, s); 3222 } 3223 return parts_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s); 3224 } 3225 3226 static int64_t floatx80_to_int64_scalbn(floatx80 a, FloatRoundMode rmode, 3227 int scale, float_status *s) 3228 { 3229 FloatParts128 p; 3230 3231 if (!floatx80_unpack_canonical(&p, a, s)) { 3232 parts_default_nan(&p, s); 3233 } 3234 return parts_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s); 3235 } 3236 3237 int8_t float16_to_int8(float16 a, float_status *s) 3238 { 3239 return float16_to_int8_scalbn(a, s->float_rounding_mode, 0, s); 3240 } 3241 3242 int16_t float16_to_int16(float16 a, float_status *s) 3243 { 3244 return float16_to_int16_scalbn(a, s->float_rounding_mode, 0, s); 3245 } 3246 3247 int32_t float16_to_int32(float16 a, float_status *s) 3248 { 3249 return float16_to_int32_scalbn(a, s->float_rounding_mode, 0, s); 3250 } 3251 3252 int64_t float16_to_int64(float16 a, float_status *s) 3253 { 3254 return float16_to_int64_scalbn(a, s->float_rounding_mode, 0, s); 3255 } 3256 3257 int16_t float32_to_int16(float32 a, float_status *s) 3258 { 3259 return float32_to_int16_scalbn(a, s->float_rounding_mode, 0, s); 3260 } 3261 3262 int32_t float32_to_int32(float32 a, float_status *s) 3263 { 3264 return float32_to_int32_scalbn(a, s->float_rounding_mode, 0, s); 3265 } 3266 3267 int64_t float32_to_int64(float32 a, float_status *s) 3268 { 3269 return float32_to_int64_scalbn(a, s->float_rounding_mode, 0, s); 3270 } 3271 3272 int16_t float64_to_int16(float64 a, float_status *s) 3273 { 3274 return float64_to_int16_scalbn(a, s->float_rounding_mode, 0, s); 3275 } 3276 3277 int32_t float64_to_int32(float64 a, float_status *s) 3278 { 3279 return float64_to_int32_scalbn(a, s->float_rounding_mode, 0, s); 3280 } 3281 3282 int64_t float64_to_int64(float64 a, float_status *s) 3283 { 3284 return float64_to_int64_scalbn(a, s->float_rounding_mode, 0, s); 3285 } 3286 3287 int32_t float128_to_int32(float128 a, float_status *s) 3288 { 3289 return float128_to_int32_scalbn(a, s->float_rounding_mode, 0, s); 3290 } 3291 3292 int64_t float128_to_int64(float128 a, float_status *s) 3293 { 3294 return float128_to_int64_scalbn(a, s->float_rounding_mode, 0, s); 3295 } 3296 3297 Int128 float128_to_int128(float128 a, float_status *s) 3298 { 3299 return float128_to_int128_scalbn(a, s->float_rounding_mode, 0, s); 3300 } 3301 3302 int32_t floatx80_to_int32(floatx80 a, float_status *s) 3303 { 3304 return floatx80_to_int32_scalbn(a, s->float_rounding_mode, 0, s); 3305 } 3306 3307 int64_t floatx80_to_int64(floatx80 a, float_status *s) 3308 { 3309 return floatx80_to_int64_scalbn(a, s->float_rounding_mode, 0, s); 3310 } 3311 3312 int16_t float16_to_int16_round_to_zero(float16 a, float_status *s) 3313 { 3314 return float16_to_int16_scalbn(a, float_round_to_zero, 0, s); 3315 } 3316 3317 int32_t float16_to_int32_round_to_zero(float16 a, float_status *s) 3318 { 3319 return float16_to_int32_scalbn(a, float_round_to_zero, 0, s); 3320 } 3321 3322 int64_t float16_to_int64_round_to_zero(float16 a, float_status *s) 3323 { 3324 return float16_to_int64_scalbn(a, float_round_to_zero, 0, s); 3325 } 3326 3327 int16_t float32_to_int16_round_to_zero(float32 a, float_status *s) 3328 { 3329 return float32_to_int16_scalbn(a, float_round_to_zero, 0, s); 3330 } 3331 3332 int32_t float32_to_int32_round_to_zero(float32 a, float_status *s) 3333 { 3334 return float32_to_int32_scalbn(a, float_round_to_zero, 0, s); 3335 } 3336 3337 int64_t float32_to_int64_round_to_zero(float32 a, float_status *s) 3338 { 3339 return float32_to_int64_scalbn(a, float_round_to_zero, 0, s); 3340 } 3341 3342 int16_t float64_to_int16_round_to_zero(float64 a, float_status *s) 3343 { 3344 return float64_to_int16_scalbn(a, float_round_to_zero, 0, s); 3345 } 3346 3347 int32_t float64_to_int32_round_to_zero(float64 a, float_status *s) 3348 { 3349 return float64_to_int32_scalbn(a, float_round_to_zero, 0, s); 3350 } 3351 3352 int64_t float64_to_int64_round_to_zero(float64 a, float_status *s) 3353 { 3354 return float64_to_int64_scalbn(a, float_round_to_zero, 0, s); 3355 } 3356 3357 int32_t float128_to_int32_round_to_zero(float128 a, float_status *s) 3358 { 3359 return float128_to_int32_scalbn(a, float_round_to_zero, 0, s); 3360 } 3361 3362 int64_t float128_to_int64_round_to_zero(float128 a, float_status *s) 3363 { 3364 return float128_to_int64_scalbn(a, float_round_to_zero, 0, s); 3365 } 3366 3367 Int128 float128_to_int128_round_to_zero(float128 a, float_status *s) 3368 { 3369 return float128_to_int128_scalbn(a, float_round_to_zero, 0, s); 3370 } 3371 3372 int32_t floatx80_to_int32_round_to_zero(floatx80 a, float_status *s) 3373 { 3374 return floatx80_to_int32_scalbn(a, float_round_to_zero, 0, s); 3375 } 3376 3377 int64_t floatx80_to_int64_round_to_zero(floatx80 a, float_status *s) 3378 { 3379 return floatx80_to_int64_scalbn(a, float_round_to_zero, 0, s); 3380 } 3381 3382 int16_t bfloat16_to_int16(bfloat16 a, float_status *s) 3383 { 3384 return bfloat16_to_int16_scalbn(a, s->float_rounding_mode, 0, s); 3385 } 3386 3387 int32_t bfloat16_to_int32(bfloat16 a, float_status *s) 3388 { 3389 return bfloat16_to_int32_scalbn(a, s->float_rounding_mode, 0, s); 3390 } 3391 3392 int64_t bfloat16_to_int64(bfloat16 a, float_status *s) 3393 { 3394 return bfloat16_to_int64_scalbn(a, s->float_rounding_mode, 0, s); 3395 } 3396 3397 int16_t bfloat16_to_int16_round_to_zero(bfloat16 a, float_status *s) 3398 { 3399 return bfloat16_to_int16_scalbn(a, float_round_to_zero, 0, s); 3400 } 3401 3402 int32_t bfloat16_to_int32_round_to_zero(bfloat16 a, float_status *s) 3403 { 3404 return bfloat16_to_int32_scalbn(a, float_round_to_zero, 0, s); 3405 } 3406 3407 int64_t bfloat16_to_int64_round_to_zero(bfloat16 a, float_status *s) 3408 { 3409 return bfloat16_to_int64_scalbn(a, float_round_to_zero, 0, s); 3410 } 3411 3412 /* 3413 * Floating-point to unsigned integer conversions 3414 */ 3415 3416 uint8_t float16_to_uint8_scalbn(float16 a, FloatRoundMode rmode, int scale, 3417 float_status *s) 3418 { 3419 FloatParts64 p; 3420 3421 float16_unpack_canonical(&p, a, s); 3422 return parts_float_to_uint(&p, rmode, scale, UINT8_MAX, s); 3423 } 3424 3425 uint16_t float16_to_uint16_scalbn(float16 a, FloatRoundMode rmode, int scale, 3426 float_status *s) 3427 { 3428 FloatParts64 p; 3429 3430 float16_unpack_canonical(&p, a, s); 3431 return parts_float_to_uint(&p, rmode, scale, UINT16_MAX, s); 3432 } 3433 3434 uint32_t float16_to_uint32_scalbn(float16 a, FloatRoundMode rmode, int scale, 3435 float_status *s) 3436 { 3437 FloatParts64 p; 3438 3439 float16_unpack_canonical(&p, a, s); 3440 return parts_float_to_uint(&p, rmode, scale, UINT32_MAX, s); 3441 } 3442 3443 uint64_t float16_to_uint64_scalbn(float16 a, FloatRoundMode rmode, int scale, 3444 float_status *s) 3445 { 3446 FloatParts64 p; 3447 3448 float16_unpack_canonical(&p, a, s); 3449 return parts_float_to_uint(&p, rmode, scale, UINT64_MAX, s); 3450 } 3451 3452 uint16_t float32_to_uint16_scalbn(float32 a, FloatRoundMode rmode, int scale, 3453 float_status *s) 3454 { 3455 FloatParts64 p; 3456 3457 float32_unpack_canonical(&p, a, s); 3458 return parts_float_to_uint(&p, rmode, scale, UINT16_MAX, s); 3459 } 3460 3461 uint32_t float32_to_uint32_scalbn(float32 a, FloatRoundMode rmode, int scale, 3462 float_status *s) 3463 { 3464 FloatParts64 p; 3465 3466 float32_unpack_canonical(&p, a, s); 3467 return parts_float_to_uint(&p, rmode, scale, UINT32_MAX, s); 3468 } 3469 3470 uint64_t float32_to_uint64_scalbn(float32 a, FloatRoundMode rmode, int scale, 3471 float_status *s) 3472 { 3473 FloatParts64 p; 3474 3475 float32_unpack_canonical(&p, a, s); 3476 return parts_float_to_uint(&p, rmode, scale, UINT64_MAX, s); 3477 } 3478 3479 uint16_t float64_to_uint16_scalbn(float64 a, FloatRoundMode rmode, int scale, 3480 float_status *s) 3481 { 3482 FloatParts64 p; 3483 3484 float64_unpack_canonical(&p, a, s); 3485 return parts_float_to_uint(&p, rmode, scale, UINT16_MAX, s); 3486 } 3487 3488 uint32_t float64_to_uint32_scalbn(float64 a, FloatRoundMode rmode, int scale, 3489 float_status *s) 3490 { 3491 FloatParts64 p; 3492 3493 float64_unpack_canonical(&p, a, s); 3494 return parts_float_to_uint(&p, rmode, scale, UINT32_MAX, s); 3495 } 3496 3497 uint64_t float64_to_uint64_scalbn(float64 a, FloatRoundMode rmode, int scale, 3498 float_status *s) 3499 { 3500 FloatParts64 p; 3501 3502 float64_unpack_canonical(&p, a, s); 3503 return parts_float_to_uint(&p, rmode, scale, UINT64_MAX, s); 3504 } 3505 3506 uint16_t bfloat16_to_uint16_scalbn(bfloat16 a, FloatRoundMode rmode, 3507 int scale, float_status *s) 3508 { 3509 FloatParts64 p; 3510 3511 bfloat16_unpack_canonical(&p, a, s); 3512 return parts_float_to_uint(&p, rmode, scale, UINT16_MAX, s); 3513 } 3514 3515 uint32_t bfloat16_to_uint32_scalbn(bfloat16 a, FloatRoundMode rmode, 3516 int scale, float_status *s) 3517 { 3518 FloatParts64 p; 3519 3520 bfloat16_unpack_canonical(&p, a, s); 3521 return parts_float_to_uint(&p, rmode, scale, UINT32_MAX, s); 3522 } 3523 3524 uint64_t bfloat16_to_uint64_scalbn(bfloat16 a, FloatRoundMode rmode, 3525 int scale, float_status *s) 3526 { 3527 FloatParts64 p; 3528 3529 bfloat16_unpack_canonical(&p, a, s); 3530 return parts_float_to_uint(&p, rmode, scale, UINT64_MAX, s); 3531 } 3532 3533 static uint32_t float128_to_uint32_scalbn(float128 a, FloatRoundMode rmode, 3534 int scale, float_status *s) 3535 { 3536 FloatParts128 p; 3537 3538 float128_unpack_canonical(&p, a, s); 3539 return parts_float_to_uint(&p, rmode, scale, UINT32_MAX, s); 3540 } 3541 3542 static uint64_t float128_to_uint64_scalbn(float128 a, FloatRoundMode rmode, 3543 int scale, float_status *s) 3544 { 3545 FloatParts128 p; 3546 3547 float128_unpack_canonical(&p, a, s); 3548 return parts_float_to_uint(&p, rmode, scale, UINT64_MAX, s); 3549 } 3550 3551 static Int128 float128_to_uint128_scalbn(float128 a, FloatRoundMode rmode, 3552 int scale, float_status *s) 3553 { 3554 int flags = 0; 3555 Int128 r; 3556 FloatParts128 p; 3557 3558 float128_unpack_canonical(&p, a, s); 3559 3560 switch (p.cls) { 3561 case float_class_snan: 3562 flags |= float_flag_invalid_snan; 3563 /* fall through */ 3564 case float_class_qnan: 3565 flags |= float_flag_invalid; 3566 r = UINT128_MAX; 3567 break; 3568 3569 case float_class_inf: 3570 flags = float_flag_invalid | float_flag_invalid_cvti; 3571 r = p.sign ? int128_zero() : UINT128_MAX; 3572 break; 3573 3574 case float_class_zero: 3575 return int128_zero(); 3576 3577 case float_class_normal: 3578 if (parts_round_to_int_normal(&p, rmode, scale, 128 - 2)) { 3579 flags = float_flag_inexact; 3580 if (p.cls == float_class_zero) { 3581 r = int128_zero(); 3582 break; 3583 } 3584 } 3585 3586 if (p.sign) { 3587 flags = float_flag_invalid | float_flag_invalid_cvti; 3588 r = int128_zero(); 3589 } else if (p.exp <= 127) { 3590 int shift = 127 - p.exp; 3591 r = int128_urshift(int128_make128(p.frac_lo, p.frac_hi), shift); 3592 } else { 3593 flags = float_flag_invalid | float_flag_invalid_cvti; 3594 r = UINT128_MAX; 3595 } 3596 break; 3597 3598 default: 3599 g_assert_not_reached(); 3600 } 3601 3602 float_raise(flags, s); 3603 return r; 3604 } 3605 3606 uint8_t float16_to_uint8(float16 a, float_status *s) 3607 { 3608 return float16_to_uint8_scalbn(a, s->float_rounding_mode, 0, s); 3609 } 3610 3611 uint16_t float16_to_uint16(float16 a, float_status *s) 3612 { 3613 return float16_to_uint16_scalbn(a, s->float_rounding_mode, 0, s); 3614 } 3615 3616 uint32_t float16_to_uint32(float16 a, float_status *s) 3617 { 3618 return float16_to_uint32_scalbn(a, s->float_rounding_mode, 0, s); 3619 } 3620 3621 uint64_t float16_to_uint64(float16 a, float_status *s) 3622 { 3623 return float16_to_uint64_scalbn(a, s->float_rounding_mode, 0, s); 3624 } 3625 3626 uint16_t float32_to_uint16(float32 a, float_status *s) 3627 { 3628 return float32_to_uint16_scalbn(a, s->float_rounding_mode, 0, s); 3629 } 3630 3631 uint32_t float32_to_uint32(float32 a, float_status *s) 3632 { 3633 return float32_to_uint32_scalbn(a, s->float_rounding_mode, 0, s); 3634 } 3635 3636 uint64_t float32_to_uint64(float32 a, float_status *s) 3637 { 3638 return float32_to_uint64_scalbn(a, s->float_rounding_mode, 0, s); 3639 } 3640 3641 uint16_t float64_to_uint16(float64 a, float_status *s) 3642 { 3643 return float64_to_uint16_scalbn(a, s->float_rounding_mode, 0, s); 3644 } 3645 3646 uint32_t float64_to_uint32(float64 a, float_status *s) 3647 { 3648 return float64_to_uint32_scalbn(a, s->float_rounding_mode, 0, s); 3649 } 3650 3651 uint64_t float64_to_uint64(float64 a, float_status *s) 3652 { 3653 return float64_to_uint64_scalbn(a, s->float_rounding_mode, 0, s); 3654 } 3655 3656 uint32_t float128_to_uint32(float128 a, float_status *s) 3657 { 3658 return float128_to_uint32_scalbn(a, s->float_rounding_mode, 0, s); 3659 } 3660 3661 uint64_t float128_to_uint64(float128 a, float_status *s) 3662 { 3663 return float128_to_uint64_scalbn(a, s->float_rounding_mode, 0, s); 3664 } 3665 3666 Int128 float128_to_uint128(float128 a, float_status *s) 3667 { 3668 return float128_to_uint128_scalbn(a, s->float_rounding_mode, 0, s); 3669 } 3670 3671 uint16_t float16_to_uint16_round_to_zero(float16 a, float_status *s) 3672 { 3673 return float16_to_uint16_scalbn(a, float_round_to_zero, 0, s); 3674 } 3675 3676 uint32_t float16_to_uint32_round_to_zero(float16 a, float_status *s) 3677 { 3678 return float16_to_uint32_scalbn(a, float_round_to_zero, 0, s); 3679 } 3680 3681 uint64_t float16_to_uint64_round_to_zero(float16 a, float_status *s) 3682 { 3683 return float16_to_uint64_scalbn(a, float_round_to_zero, 0, s); 3684 } 3685 3686 uint16_t float32_to_uint16_round_to_zero(float32 a, float_status *s) 3687 { 3688 return float32_to_uint16_scalbn(a, float_round_to_zero, 0, s); 3689 } 3690 3691 uint32_t float32_to_uint32_round_to_zero(float32 a, float_status *s) 3692 { 3693 return float32_to_uint32_scalbn(a, float_round_to_zero, 0, s); 3694 } 3695 3696 uint64_t float32_to_uint64_round_to_zero(float32 a, float_status *s) 3697 { 3698 return float32_to_uint64_scalbn(a, float_round_to_zero, 0, s); 3699 } 3700 3701 uint16_t float64_to_uint16_round_to_zero(float64 a, float_status *s) 3702 { 3703 return float64_to_uint16_scalbn(a, float_round_to_zero, 0, s); 3704 } 3705 3706 uint32_t float64_to_uint32_round_to_zero(float64 a, float_status *s) 3707 { 3708 return float64_to_uint32_scalbn(a, float_round_to_zero, 0, s); 3709 } 3710 3711 uint64_t float64_to_uint64_round_to_zero(float64 a, float_status *s) 3712 { 3713 return float64_to_uint64_scalbn(a, float_round_to_zero, 0, s); 3714 } 3715 3716 uint32_t float128_to_uint32_round_to_zero(float128 a, float_status *s) 3717 { 3718 return float128_to_uint32_scalbn(a, float_round_to_zero, 0, s); 3719 } 3720 3721 uint64_t float128_to_uint64_round_to_zero(float128 a, float_status *s) 3722 { 3723 return float128_to_uint64_scalbn(a, float_round_to_zero, 0, s); 3724 } 3725 3726 Int128 float128_to_uint128_round_to_zero(float128 a, float_status *s) 3727 { 3728 return float128_to_uint128_scalbn(a, float_round_to_zero, 0, s); 3729 } 3730 3731 uint16_t bfloat16_to_uint16(bfloat16 a, float_status *s) 3732 { 3733 return bfloat16_to_uint16_scalbn(a, s->float_rounding_mode, 0, s); 3734 } 3735 3736 uint32_t bfloat16_to_uint32(bfloat16 a, float_status *s) 3737 { 3738 return bfloat16_to_uint32_scalbn(a, s->float_rounding_mode, 0, s); 3739 } 3740 3741 uint64_t bfloat16_to_uint64(bfloat16 a, float_status *s) 3742 { 3743 return bfloat16_to_uint64_scalbn(a, s->float_rounding_mode, 0, s); 3744 } 3745 3746 uint16_t bfloat16_to_uint16_round_to_zero(bfloat16 a, float_status *s) 3747 { 3748 return bfloat16_to_uint16_scalbn(a, float_round_to_zero, 0, s); 3749 } 3750 3751 uint32_t bfloat16_to_uint32_round_to_zero(bfloat16 a, float_status *s) 3752 { 3753 return bfloat16_to_uint32_scalbn(a, float_round_to_zero, 0, s); 3754 } 3755 3756 uint64_t bfloat16_to_uint64_round_to_zero(bfloat16 a, float_status *s) 3757 { 3758 return bfloat16_to_uint64_scalbn(a, float_round_to_zero, 0, s); 3759 } 3760 3761 /* 3762 * Signed integer to floating-point conversions 3763 */ 3764 3765 float16 int64_to_float16_scalbn(int64_t a, int scale, float_status *status) 3766 { 3767 FloatParts64 p; 3768 3769 parts_sint_to_float(&p, a, scale, status); 3770 return float16_round_pack_canonical(&p, status); 3771 } 3772 3773 float16 int32_to_float16_scalbn(int32_t a, int scale, float_status *status) 3774 { 3775 return int64_to_float16_scalbn(a, scale, status); 3776 } 3777 3778 float16 int16_to_float16_scalbn(int16_t a, int scale, float_status *status) 3779 { 3780 return int64_to_float16_scalbn(a, scale, status); 3781 } 3782 3783 float16 int64_to_float16(int64_t a, float_status *status) 3784 { 3785 return int64_to_float16_scalbn(a, 0, status); 3786 } 3787 3788 float16 int32_to_float16(int32_t a, float_status *status) 3789 { 3790 return int64_to_float16_scalbn(a, 0, status); 3791 } 3792 3793 float16 int16_to_float16(int16_t a, float_status *status) 3794 { 3795 return int64_to_float16_scalbn(a, 0, status); 3796 } 3797 3798 float16 int8_to_float16(int8_t a, float_status *status) 3799 { 3800 return int64_to_float16_scalbn(a, 0, status); 3801 } 3802 3803 float32 int64_to_float32_scalbn(int64_t a, int scale, float_status *status) 3804 { 3805 FloatParts64 p; 3806 3807 /* Without scaling, there are no overflow concerns. */ 3808 if (likely(scale == 0) && can_use_fpu(status)) { 3809 union_float32 ur; 3810 ur.h = a; 3811 return ur.s; 3812 } 3813 3814 parts64_sint_to_float(&p, a, scale, status); 3815 return float32_round_pack_canonical(&p, status); 3816 } 3817 3818 float32 int32_to_float32_scalbn(int32_t a, int scale, float_status *status) 3819 { 3820 return int64_to_float32_scalbn(a, scale, status); 3821 } 3822 3823 float32 int16_to_float32_scalbn(int16_t a, int scale, float_status *status) 3824 { 3825 return int64_to_float32_scalbn(a, scale, status); 3826 } 3827 3828 float32 int64_to_float32(int64_t a, float_status *status) 3829 { 3830 return int64_to_float32_scalbn(a, 0, status); 3831 } 3832 3833 float32 int32_to_float32(int32_t a, float_status *status) 3834 { 3835 return int64_to_float32_scalbn(a, 0, status); 3836 } 3837 3838 float32 int16_to_float32(int16_t a, float_status *status) 3839 { 3840 return int64_to_float32_scalbn(a, 0, status); 3841 } 3842 3843 float64 int64_to_float64_scalbn(int64_t a, int scale, float_status *status) 3844 { 3845 FloatParts64 p; 3846 3847 /* Without scaling, there are no overflow concerns. */ 3848 if (likely(scale == 0) && can_use_fpu(status)) { 3849 union_float64 ur; 3850 ur.h = a; 3851 return ur.s; 3852 } 3853 3854 parts_sint_to_float(&p, a, scale, status); 3855 return float64_round_pack_canonical(&p, status); 3856 } 3857 3858 float64 int32_to_float64_scalbn(int32_t a, int scale, float_status *status) 3859 { 3860 return int64_to_float64_scalbn(a, scale, status); 3861 } 3862 3863 float64 int16_to_float64_scalbn(int16_t a, int scale, float_status *status) 3864 { 3865 return int64_to_float64_scalbn(a, scale, status); 3866 } 3867 3868 float64 int64_to_float64(int64_t a, float_status *status) 3869 { 3870 return int64_to_float64_scalbn(a, 0, status); 3871 } 3872 3873 float64 int32_to_float64(int32_t a, float_status *status) 3874 { 3875 return int64_to_float64_scalbn(a, 0, status); 3876 } 3877 3878 float64 int16_to_float64(int16_t a, float_status *status) 3879 { 3880 return int64_to_float64_scalbn(a, 0, status); 3881 } 3882 3883 bfloat16 int64_to_bfloat16_scalbn(int64_t a, int scale, float_status *status) 3884 { 3885 FloatParts64 p; 3886 3887 parts_sint_to_float(&p, a, scale, status); 3888 return bfloat16_round_pack_canonical(&p, status); 3889 } 3890 3891 bfloat16 int32_to_bfloat16_scalbn(int32_t a, int scale, float_status *status) 3892 { 3893 return int64_to_bfloat16_scalbn(a, scale, status); 3894 } 3895 3896 bfloat16 int16_to_bfloat16_scalbn(int16_t a, int scale, float_status *status) 3897 { 3898 return int64_to_bfloat16_scalbn(a, scale, status); 3899 } 3900 3901 bfloat16 int64_to_bfloat16(int64_t a, float_status *status) 3902 { 3903 return int64_to_bfloat16_scalbn(a, 0, status); 3904 } 3905 3906 bfloat16 int32_to_bfloat16(int32_t a, float_status *status) 3907 { 3908 return int64_to_bfloat16_scalbn(a, 0, status); 3909 } 3910 3911 bfloat16 int16_to_bfloat16(int16_t a, float_status *status) 3912 { 3913 return int64_to_bfloat16_scalbn(a, 0, status); 3914 } 3915 3916 float128 int128_to_float128(Int128 a, float_status *status) 3917 { 3918 FloatParts128 p = { }; 3919 int shift; 3920 3921 if (int128_nz(a)) { 3922 p.cls = float_class_normal; 3923 if (!int128_nonneg(a)) { 3924 p.sign = true; 3925 a = int128_neg(a); 3926 } 3927 3928 shift = clz64(int128_gethi(a)); 3929 if (shift == 64) { 3930 shift += clz64(int128_getlo(a)); 3931 } 3932 3933 p.exp = 127 - shift; 3934 a = int128_lshift(a, shift); 3935 3936 p.frac_hi = int128_gethi(a); 3937 p.frac_lo = int128_getlo(a); 3938 } else { 3939 p.cls = float_class_zero; 3940 } 3941 3942 return float128_round_pack_canonical(&p, status); 3943 } 3944 3945 float128 int64_to_float128(int64_t a, float_status *status) 3946 { 3947 FloatParts128 p; 3948 3949 parts_sint_to_float(&p, a, 0, status); 3950 return float128_round_pack_canonical(&p, status); 3951 } 3952 3953 float128 int32_to_float128(int32_t a, float_status *status) 3954 { 3955 return int64_to_float128(a, status); 3956 } 3957 3958 floatx80 int64_to_floatx80(int64_t a, float_status *status) 3959 { 3960 FloatParts128 p; 3961 3962 parts_sint_to_float(&p, a, 0, status); 3963 return floatx80_round_pack_canonical(&p, status); 3964 } 3965 3966 floatx80 int32_to_floatx80(int32_t a, float_status *status) 3967 { 3968 return int64_to_floatx80(a, status); 3969 } 3970 3971 /* 3972 * Unsigned Integer to floating-point conversions 3973 */ 3974 3975 float16 uint64_to_float16_scalbn(uint64_t a, int scale, float_status *status) 3976 { 3977 FloatParts64 p; 3978 3979 parts_uint_to_float(&p, a, scale, status); 3980 return float16_round_pack_canonical(&p, status); 3981 } 3982 3983 float16 uint32_to_float16_scalbn(uint32_t a, int scale, float_status *status) 3984 { 3985 return uint64_to_float16_scalbn(a, scale, status); 3986 } 3987 3988 float16 uint16_to_float16_scalbn(uint16_t a, int scale, float_status *status) 3989 { 3990 return uint64_to_float16_scalbn(a, scale, status); 3991 } 3992 3993 float16 uint64_to_float16(uint64_t a, float_status *status) 3994 { 3995 return uint64_to_float16_scalbn(a, 0, status); 3996 } 3997 3998 float16 uint32_to_float16(uint32_t a, float_status *status) 3999 { 4000 return uint64_to_float16_scalbn(a, 0, status); 4001 } 4002 4003 float16 uint16_to_float16(uint16_t a, float_status *status) 4004 { 4005 return uint64_to_float16_scalbn(a, 0, status); 4006 } 4007 4008 float16 uint8_to_float16(uint8_t a, float_status *status) 4009 { 4010 return uint64_to_float16_scalbn(a, 0, status); 4011 } 4012 4013 float32 uint64_to_float32_scalbn(uint64_t a, int scale, float_status *status) 4014 { 4015 FloatParts64 p; 4016 4017 /* Without scaling, there are no overflow concerns. */ 4018 if (likely(scale == 0) && can_use_fpu(status)) { 4019 union_float32 ur; 4020 ur.h = a; 4021 return ur.s; 4022 } 4023 4024 parts_uint_to_float(&p, a, scale, status); 4025 return float32_round_pack_canonical(&p, status); 4026 } 4027 4028 float32 uint32_to_float32_scalbn(uint32_t a, int scale, float_status *status) 4029 { 4030 return uint64_to_float32_scalbn(a, scale, status); 4031 } 4032 4033 float32 uint16_to_float32_scalbn(uint16_t a, int scale, float_status *status) 4034 { 4035 return uint64_to_float32_scalbn(a, scale, status); 4036 } 4037 4038 float32 uint64_to_float32(uint64_t a, float_status *status) 4039 { 4040 return uint64_to_float32_scalbn(a, 0, status); 4041 } 4042 4043 float32 uint32_to_float32(uint32_t a, float_status *status) 4044 { 4045 return uint64_to_float32_scalbn(a, 0, status); 4046 } 4047 4048 float32 uint16_to_float32(uint16_t a, float_status *status) 4049 { 4050 return uint64_to_float32_scalbn(a, 0, status); 4051 } 4052 4053 float64 uint64_to_float64_scalbn(uint64_t a, int scale, float_status *status) 4054 { 4055 FloatParts64 p; 4056 4057 /* Without scaling, there are no overflow concerns. */ 4058 if (likely(scale == 0) && can_use_fpu(status)) { 4059 union_float64 ur; 4060 ur.h = a; 4061 return ur.s; 4062 } 4063 4064 parts_uint_to_float(&p, a, scale, status); 4065 return float64_round_pack_canonical(&p, status); 4066 } 4067 4068 float64 uint32_to_float64_scalbn(uint32_t a, int scale, float_status *status) 4069 { 4070 return uint64_to_float64_scalbn(a, scale, status); 4071 } 4072 4073 float64 uint16_to_float64_scalbn(uint16_t a, int scale, float_status *status) 4074 { 4075 return uint64_to_float64_scalbn(a, scale, status); 4076 } 4077 4078 float64 uint64_to_float64(uint64_t a, float_status *status) 4079 { 4080 return uint64_to_float64_scalbn(a, 0, status); 4081 } 4082 4083 float64 uint32_to_float64(uint32_t a, float_status *status) 4084 { 4085 return uint64_to_float64_scalbn(a, 0, status); 4086 } 4087 4088 float64 uint16_to_float64(uint16_t a, float_status *status) 4089 { 4090 return uint64_to_float64_scalbn(a, 0, status); 4091 } 4092 4093 bfloat16 uint64_to_bfloat16_scalbn(uint64_t a, int scale, float_status *status) 4094 { 4095 FloatParts64 p; 4096 4097 parts_uint_to_float(&p, a, scale, status); 4098 return bfloat16_round_pack_canonical(&p, status); 4099 } 4100 4101 bfloat16 uint32_to_bfloat16_scalbn(uint32_t a, int scale, float_status *status) 4102 { 4103 return uint64_to_bfloat16_scalbn(a, scale, status); 4104 } 4105 4106 bfloat16 uint16_to_bfloat16_scalbn(uint16_t a, int scale, float_status *status) 4107 { 4108 return uint64_to_bfloat16_scalbn(a, scale, status); 4109 } 4110 4111 bfloat16 uint64_to_bfloat16(uint64_t a, float_status *status) 4112 { 4113 return uint64_to_bfloat16_scalbn(a, 0, status); 4114 } 4115 4116 bfloat16 uint32_to_bfloat16(uint32_t a, float_status *status) 4117 { 4118 return uint64_to_bfloat16_scalbn(a, 0, status); 4119 } 4120 4121 bfloat16 uint16_to_bfloat16(uint16_t a, float_status *status) 4122 { 4123 return uint64_to_bfloat16_scalbn(a, 0, status); 4124 } 4125 4126 float128 uint64_to_float128(uint64_t a, float_status *status) 4127 { 4128 FloatParts128 p; 4129 4130 parts_uint_to_float(&p, a, 0, status); 4131 return float128_round_pack_canonical(&p, status); 4132 } 4133 4134 float128 uint128_to_float128(Int128 a, float_status *status) 4135 { 4136 FloatParts128 p = { }; 4137 int shift; 4138 4139 if (int128_nz(a)) { 4140 p.cls = float_class_normal; 4141 4142 shift = clz64(int128_gethi(a)); 4143 if (shift == 64) { 4144 shift += clz64(int128_getlo(a)); 4145 } 4146 4147 p.exp = 127 - shift; 4148 a = int128_lshift(a, shift); 4149 4150 p.frac_hi = int128_gethi(a); 4151 p.frac_lo = int128_getlo(a); 4152 } else { 4153 p.cls = float_class_zero; 4154 } 4155 4156 return float128_round_pack_canonical(&p, status); 4157 } 4158 4159 /* 4160 * Minimum and maximum 4161 */ 4162 4163 static float16 float16_minmax(float16 a, float16 b, float_status *s, int flags) 4164 { 4165 FloatParts64 pa, pb, *pr; 4166 4167 float16_unpack_canonical(&pa, a, s); 4168 float16_unpack_canonical(&pb, b, s); 4169 pr = parts_minmax(&pa, &pb, s, flags); 4170 4171 return float16_round_pack_canonical(pr, s); 4172 } 4173 4174 static bfloat16 bfloat16_minmax(bfloat16 a, bfloat16 b, 4175 float_status *s, int flags) 4176 { 4177 FloatParts64 pa, pb, *pr; 4178 4179 bfloat16_unpack_canonical(&pa, a, s); 4180 bfloat16_unpack_canonical(&pb, b, s); 4181 pr = parts_minmax(&pa, &pb, s, flags); 4182 4183 return bfloat16_round_pack_canonical(pr, s); 4184 } 4185 4186 static float32 float32_minmax(float32 a, float32 b, float_status *s, int flags) 4187 { 4188 FloatParts64 pa, pb, *pr; 4189 4190 float32_unpack_canonical(&pa, a, s); 4191 float32_unpack_canonical(&pb, b, s); 4192 pr = parts_minmax(&pa, &pb, s, flags); 4193 4194 return float32_round_pack_canonical(pr, s); 4195 } 4196 4197 static float64 float64_minmax(float64 a, float64 b, float_status *s, int flags) 4198 { 4199 FloatParts64 pa, pb, *pr; 4200 4201 float64_unpack_canonical(&pa, a, s); 4202 float64_unpack_canonical(&pb, b, s); 4203 pr = parts_minmax(&pa, &pb, s, flags); 4204 4205 return float64_round_pack_canonical(pr, s); 4206 } 4207 4208 static float128 float128_minmax(float128 a, float128 b, 4209 float_status *s, int flags) 4210 { 4211 FloatParts128 pa, pb, *pr; 4212 4213 float128_unpack_canonical(&pa, a, s); 4214 float128_unpack_canonical(&pb, b, s); 4215 pr = parts_minmax(&pa, &pb, s, flags); 4216 4217 return float128_round_pack_canonical(pr, s); 4218 } 4219 4220 #define MINMAX_1(type, name, flags) \ 4221 type type##_##name(type a, type b, float_status *s) \ 4222 { return type##_minmax(a, b, s, flags); } 4223 4224 #define MINMAX_2(type) \ 4225 MINMAX_1(type, max, 0) \ 4226 MINMAX_1(type, maxnum, minmax_isnum) \ 4227 MINMAX_1(type, maxnummag, minmax_isnum | minmax_ismag) \ 4228 MINMAX_1(type, maximum_number, minmax_isnumber) \ 4229 MINMAX_1(type, min, minmax_ismin) \ 4230 MINMAX_1(type, minnum, minmax_ismin | minmax_isnum) \ 4231 MINMAX_1(type, minnummag, minmax_ismin | minmax_isnum | minmax_ismag) \ 4232 MINMAX_1(type, minimum_number, minmax_ismin | minmax_isnumber) \ 4233 4234 MINMAX_2(float16) 4235 MINMAX_2(bfloat16) 4236 MINMAX_2(float32) 4237 MINMAX_2(float64) 4238 MINMAX_2(float128) 4239 4240 #undef MINMAX_1 4241 #undef MINMAX_2 4242 4243 /* 4244 * Floating point compare 4245 */ 4246 4247 static FloatRelation QEMU_FLATTEN 4248 float16_do_compare(float16 a, float16 b, float_status *s, bool is_quiet) 4249 { 4250 FloatParts64 pa, pb; 4251 4252 float16_unpack_canonical(&pa, a, s); 4253 float16_unpack_canonical(&pb, b, s); 4254 return parts_compare(&pa, &pb, s, is_quiet); 4255 } 4256 4257 FloatRelation float16_compare(float16 a, float16 b, float_status *s) 4258 { 4259 return float16_do_compare(a, b, s, false); 4260 } 4261 4262 FloatRelation float16_compare_quiet(float16 a, float16 b, float_status *s) 4263 { 4264 return float16_do_compare(a, b, s, true); 4265 } 4266 4267 static FloatRelation QEMU_SOFTFLOAT_ATTR 4268 float32_do_compare(float32 a, float32 b, float_status *s, bool is_quiet) 4269 { 4270 FloatParts64 pa, pb; 4271 4272 float32_unpack_canonical(&pa, a, s); 4273 float32_unpack_canonical(&pb, b, s); 4274 return parts_compare(&pa, &pb, s, is_quiet); 4275 } 4276 4277 static FloatRelation QEMU_FLATTEN 4278 float32_hs_compare(float32 xa, float32 xb, float_status *s, bool is_quiet) 4279 { 4280 union_float32 ua, ub; 4281 4282 ua.s = xa; 4283 ub.s = xb; 4284 4285 if (QEMU_NO_HARDFLOAT) { 4286 goto soft; 4287 } 4288 4289 float32_input_flush2(&ua.s, &ub.s, s); 4290 if (isgreaterequal(ua.h, ub.h)) { 4291 if (isgreater(ua.h, ub.h)) { 4292 return float_relation_greater; 4293 } 4294 return float_relation_equal; 4295 } 4296 if (likely(isless(ua.h, ub.h))) { 4297 return float_relation_less; 4298 } 4299 /* 4300 * The only condition remaining is unordered. 4301 * Fall through to set flags. 4302 */ 4303 soft: 4304 return float32_do_compare(ua.s, ub.s, s, is_quiet); 4305 } 4306 4307 FloatRelation float32_compare(float32 a, float32 b, float_status *s) 4308 { 4309 return float32_hs_compare(a, b, s, false); 4310 } 4311 4312 FloatRelation float32_compare_quiet(float32 a, float32 b, float_status *s) 4313 { 4314 return float32_hs_compare(a, b, s, true); 4315 } 4316 4317 static FloatRelation QEMU_SOFTFLOAT_ATTR 4318 float64_do_compare(float64 a, float64 b, float_status *s, bool is_quiet) 4319 { 4320 FloatParts64 pa, pb; 4321 4322 float64_unpack_canonical(&pa, a, s); 4323 float64_unpack_canonical(&pb, b, s); 4324 return parts_compare(&pa, &pb, s, is_quiet); 4325 } 4326 4327 static FloatRelation QEMU_FLATTEN 4328 float64_hs_compare(float64 xa, float64 xb, float_status *s, bool is_quiet) 4329 { 4330 union_float64 ua, ub; 4331 4332 ua.s = xa; 4333 ub.s = xb; 4334 4335 if (QEMU_NO_HARDFLOAT) { 4336 goto soft; 4337 } 4338 4339 float64_input_flush2(&ua.s, &ub.s, s); 4340 if (isgreaterequal(ua.h, ub.h)) { 4341 if (isgreater(ua.h, ub.h)) { 4342 return float_relation_greater; 4343 } 4344 return float_relation_equal; 4345 } 4346 if (likely(isless(ua.h, ub.h))) { 4347 return float_relation_less; 4348 } 4349 /* 4350 * The only condition remaining is unordered. 4351 * Fall through to set flags. 4352 */ 4353 soft: 4354 return float64_do_compare(ua.s, ub.s, s, is_quiet); 4355 } 4356 4357 FloatRelation float64_compare(float64 a, float64 b, float_status *s) 4358 { 4359 return float64_hs_compare(a, b, s, false); 4360 } 4361 4362 FloatRelation float64_compare_quiet(float64 a, float64 b, float_status *s) 4363 { 4364 return float64_hs_compare(a, b, s, true); 4365 } 4366 4367 static FloatRelation QEMU_FLATTEN 4368 bfloat16_do_compare(bfloat16 a, bfloat16 b, float_status *s, bool is_quiet) 4369 { 4370 FloatParts64 pa, pb; 4371 4372 bfloat16_unpack_canonical(&pa, a, s); 4373 bfloat16_unpack_canonical(&pb, b, s); 4374 return parts_compare(&pa, &pb, s, is_quiet); 4375 } 4376 4377 FloatRelation bfloat16_compare(bfloat16 a, bfloat16 b, float_status *s) 4378 { 4379 return bfloat16_do_compare(a, b, s, false); 4380 } 4381 4382 FloatRelation bfloat16_compare_quiet(bfloat16 a, bfloat16 b, float_status *s) 4383 { 4384 return bfloat16_do_compare(a, b, s, true); 4385 } 4386 4387 static FloatRelation QEMU_FLATTEN 4388 float128_do_compare(float128 a, float128 b, float_status *s, bool is_quiet) 4389 { 4390 FloatParts128 pa, pb; 4391 4392 float128_unpack_canonical(&pa, a, s); 4393 float128_unpack_canonical(&pb, b, s); 4394 return parts_compare(&pa, &pb, s, is_quiet); 4395 } 4396 4397 FloatRelation float128_compare(float128 a, float128 b, float_status *s) 4398 { 4399 return float128_do_compare(a, b, s, false); 4400 } 4401 4402 FloatRelation float128_compare_quiet(float128 a, float128 b, float_status *s) 4403 { 4404 return float128_do_compare(a, b, s, true); 4405 } 4406 4407 static FloatRelation QEMU_FLATTEN 4408 floatx80_do_compare(floatx80 a, floatx80 b, float_status *s, bool is_quiet) 4409 { 4410 FloatParts128 pa, pb; 4411 4412 if (!floatx80_unpack_canonical(&pa, a, s) || 4413 !floatx80_unpack_canonical(&pb, b, s)) { 4414 return float_relation_unordered; 4415 } 4416 return parts_compare(&pa, &pb, s, is_quiet); 4417 } 4418 4419 FloatRelation floatx80_compare(floatx80 a, floatx80 b, float_status *s) 4420 { 4421 return floatx80_do_compare(a, b, s, false); 4422 } 4423 4424 FloatRelation floatx80_compare_quiet(floatx80 a, floatx80 b, float_status *s) 4425 { 4426 return floatx80_do_compare(a, b, s, true); 4427 } 4428 4429 /* 4430 * Scale by 2**N 4431 */ 4432 4433 float16 float16_scalbn(float16 a, int n, float_status *status) 4434 { 4435 FloatParts64 p; 4436 4437 float16_unpack_canonical(&p, a, status); 4438 parts_scalbn(&p, n, status); 4439 return float16_round_pack_canonical(&p, status); 4440 } 4441 4442 float32 float32_scalbn(float32 a, int n, float_status *status) 4443 { 4444 FloatParts64 p; 4445 4446 float32_unpack_canonical(&p, a, status); 4447 parts_scalbn(&p, n, status); 4448 return float32_round_pack_canonical(&p, status); 4449 } 4450 4451 float64 float64_scalbn(float64 a, int n, float_status *status) 4452 { 4453 FloatParts64 p; 4454 4455 float64_unpack_canonical(&p, a, status); 4456 parts_scalbn(&p, n, status); 4457 return float64_round_pack_canonical(&p, status); 4458 } 4459 4460 bfloat16 bfloat16_scalbn(bfloat16 a, int n, float_status *status) 4461 { 4462 FloatParts64 p; 4463 4464 bfloat16_unpack_canonical(&p, a, status); 4465 parts_scalbn(&p, n, status); 4466 return bfloat16_round_pack_canonical(&p, status); 4467 } 4468 4469 float128 float128_scalbn(float128 a, int n, float_status *status) 4470 { 4471 FloatParts128 p; 4472 4473 float128_unpack_canonical(&p, a, status); 4474 parts_scalbn(&p, n, status); 4475 return float128_round_pack_canonical(&p, status); 4476 } 4477 4478 floatx80 floatx80_scalbn(floatx80 a, int n, float_status *status) 4479 { 4480 FloatParts128 p; 4481 4482 if (!floatx80_unpack_canonical(&p, a, status)) { 4483 return floatx80_default_nan(status); 4484 } 4485 parts_scalbn(&p, n, status); 4486 return floatx80_round_pack_canonical(&p, status); 4487 } 4488 4489 /* 4490 * Square Root 4491 */ 4492 4493 float16 QEMU_FLATTEN float16_sqrt(float16 a, float_status *status) 4494 { 4495 FloatParts64 p; 4496 4497 float16_unpack_canonical(&p, a, status); 4498 parts_sqrt(&p, status, &float16_params); 4499 return float16_round_pack_canonical(&p, status); 4500 } 4501 4502 static float32 QEMU_SOFTFLOAT_ATTR 4503 soft_f32_sqrt(float32 a, float_status *status) 4504 { 4505 FloatParts64 p; 4506 4507 float32_unpack_canonical(&p, a, status); 4508 parts_sqrt(&p, status, &float32_params); 4509 return float32_round_pack_canonical(&p, status); 4510 } 4511 4512 static float64 QEMU_SOFTFLOAT_ATTR 4513 soft_f64_sqrt(float64 a, float_status *status) 4514 { 4515 FloatParts64 p; 4516 4517 float64_unpack_canonical(&p, a, status); 4518 parts_sqrt(&p, status, &float64_params); 4519 return float64_round_pack_canonical(&p, status); 4520 } 4521 4522 float32 QEMU_FLATTEN float32_sqrt(float32 xa, float_status *s) 4523 { 4524 union_float32 ua, ur; 4525 4526 ua.s = xa; 4527 if (unlikely(!can_use_fpu(s))) { 4528 goto soft; 4529 } 4530 4531 float32_input_flush1(&ua.s, s); 4532 if (QEMU_HARDFLOAT_1F32_USE_FP) { 4533 if (unlikely(!(fpclassify(ua.h) == FP_NORMAL || 4534 fpclassify(ua.h) == FP_ZERO) || 4535 signbit(ua.h))) { 4536 goto soft; 4537 } 4538 } else if (unlikely(!float32_is_zero_or_normal(ua.s) || 4539 float32_is_neg(ua.s))) { 4540 goto soft; 4541 } 4542 ur.h = sqrtf(ua.h); 4543 return ur.s; 4544 4545 soft: 4546 return soft_f32_sqrt(ua.s, s); 4547 } 4548 4549 float64 QEMU_FLATTEN float64_sqrt(float64 xa, float_status *s) 4550 { 4551 union_float64 ua, ur; 4552 4553 ua.s = xa; 4554 if (unlikely(!can_use_fpu(s))) { 4555 goto soft; 4556 } 4557 4558 float64_input_flush1(&ua.s, s); 4559 if (QEMU_HARDFLOAT_1F64_USE_FP) { 4560 if (unlikely(!(fpclassify(ua.h) == FP_NORMAL || 4561 fpclassify(ua.h) == FP_ZERO) || 4562 signbit(ua.h))) { 4563 goto soft; 4564 } 4565 } else if (unlikely(!float64_is_zero_or_normal(ua.s) || 4566 float64_is_neg(ua.s))) { 4567 goto soft; 4568 } 4569 ur.h = sqrt(ua.h); 4570 return ur.s; 4571 4572 soft: 4573 return soft_f64_sqrt(ua.s, s); 4574 } 4575 4576 float64 float64r32_sqrt(float64 a, float_status *status) 4577 { 4578 FloatParts64 p; 4579 4580 float64_unpack_canonical(&p, a, status); 4581 parts_sqrt(&p, status, &float64_params); 4582 return float64r32_round_pack_canonical(&p, status); 4583 } 4584 4585 bfloat16 QEMU_FLATTEN bfloat16_sqrt(bfloat16 a, float_status *status) 4586 { 4587 FloatParts64 p; 4588 4589 bfloat16_unpack_canonical(&p, a, status); 4590 parts_sqrt(&p, status, &bfloat16_params); 4591 return bfloat16_round_pack_canonical(&p, status); 4592 } 4593 4594 float128 QEMU_FLATTEN float128_sqrt(float128 a, float_status *status) 4595 { 4596 FloatParts128 p; 4597 4598 float128_unpack_canonical(&p, a, status); 4599 parts_sqrt(&p, status, &float128_params); 4600 return float128_round_pack_canonical(&p, status); 4601 } 4602 4603 floatx80 floatx80_sqrt(floatx80 a, float_status *s) 4604 { 4605 FloatParts128 p; 4606 4607 if (!floatx80_unpack_canonical(&p, a, s)) { 4608 return floatx80_default_nan(s); 4609 } 4610 parts_sqrt(&p, s, &floatx80_params[s->floatx80_rounding_precision]); 4611 return floatx80_round_pack_canonical(&p, s); 4612 } 4613 4614 /* 4615 * log2 4616 */ 4617 float32 float32_log2(float32 a, float_status *status) 4618 { 4619 FloatParts64 p; 4620 4621 float32_unpack_canonical(&p, a, status); 4622 parts_log2(&p, status, &float32_params); 4623 return float32_round_pack_canonical(&p, status); 4624 } 4625 4626 float64 float64_log2(float64 a, float_status *status) 4627 { 4628 FloatParts64 p; 4629 4630 float64_unpack_canonical(&p, a, status); 4631 parts_log2(&p, status, &float64_params); 4632 return float64_round_pack_canonical(&p, status); 4633 } 4634 4635 /*---------------------------------------------------------------------------- 4636 | The pattern for a default generated NaN. 4637 *----------------------------------------------------------------------------*/ 4638 4639 float16 float16_default_nan(float_status *status) 4640 { 4641 FloatParts64 p; 4642 4643 parts_default_nan(&p, status); 4644 p.frac >>= float16_params.frac_shift; 4645 return float16_pack_raw(&p); 4646 } 4647 4648 float32 float32_default_nan(float_status *status) 4649 { 4650 FloatParts64 p; 4651 4652 parts_default_nan(&p, status); 4653 p.frac >>= float32_params.frac_shift; 4654 return float32_pack_raw(&p); 4655 } 4656 4657 float64 float64_default_nan(float_status *status) 4658 { 4659 FloatParts64 p; 4660 4661 parts_default_nan(&p, status); 4662 p.frac >>= float64_params.frac_shift; 4663 return float64_pack_raw(&p); 4664 } 4665 4666 float128 float128_default_nan(float_status *status) 4667 { 4668 FloatParts128 p; 4669 4670 parts_default_nan(&p, status); 4671 frac_shr(&p, float128_params.frac_shift); 4672 return float128_pack_raw(&p); 4673 } 4674 4675 bfloat16 bfloat16_default_nan(float_status *status) 4676 { 4677 FloatParts64 p; 4678 4679 parts_default_nan(&p, status); 4680 p.frac >>= bfloat16_params.frac_shift; 4681 return bfloat16_pack_raw(&p); 4682 } 4683 4684 /*---------------------------------------------------------------------------- 4685 | Returns a quiet NaN from a signalling NaN for the floating point value `a'. 4686 *----------------------------------------------------------------------------*/ 4687 4688 float16 float16_silence_nan(float16 a, float_status *status) 4689 { 4690 FloatParts64 p; 4691 4692 float16_unpack_raw(&p, a); 4693 p.frac <<= float16_params.frac_shift; 4694 parts_silence_nan(&p, status); 4695 p.frac >>= float16_params.frac_shift; 4696 return float16_pack_raw(&p); 4697 } 4698 4699 float32 float32_silence_nan(float32 a, float_status *status) 4700 { 4701 FloatParts64 p; 4702 4703 float32_unpack_raw(&p, a); 4704 p.frac <<= float32_params.frac_shift; 4705 parts_silence_nan(&p, status); 4706 p.frac >>= float32_params.frac_shift; 4707 return float32_pack_raw(&p); 4708 } 4709 4710 float64 float64_silence_nan(float64 a, float_status *status) 4711 { 4712 FloatParts64 p; 4713 4714 float64_unpack_raw(&p, a); 4715 p.frac <<= float64_params.frac_shift; 4716 parts_silence_nan(&p, status); 4717 p.frac >>= float64_params.frac_shift; 4718 return float64_pack_raw(&p); 4719 } 4720 4721 bfloat16 bfloat16_silence_nan(bfloat16 a, float_status *status) 4722 { 4723 FloatParts64 p; 4724 4725 bfloat16_unpack_raw(&p, a); 4726 p.frac <<= bfloat16_params.frac_shift; 4727 parts_silence_nan(&p, status); 4728 p.frac >>= bfloat16_params.frac_shift; 4729 return bfloat16_pack_raw(&p); 4730 } 4731 4732 float128 float128_silence_nan(float128 a, float_status *status) 4733 { 4734 FloatParts128 p; 4735 4736 float128_unpack_raw(&p, a); 4737 frac_shl(&p, float128_params.frac_shift); 4738 parts_silence_nan(&p, status); 4739 frac_shr(&p, float128_params.frac_shift); 4740 return float128_pack_raw(&p); 4741 } 4742 4743 /*---------------------------------------------------------------------------- 4744 | If `a' is denormal and we are in flush-to-zero mode then set the 4745 | input-denormal exception and return zero. Otherwise just return the value. 4746 *----------------------------------------------------------------------------*/ 4747 4748 static bool parts_squash_denormal(FloatParts64 p, float_status *status) 4749 { 4750 if (p.exp == 0 && p.frac != 0) { 4751 float_raise(float_flag_input_denormal, status); 4752 return true; 4753 } 4754 4755 return false; 4756 } 4757 4758 float16 float16_squash_input_denormal(float16 a, float_status *status) 4759 { 4760 if (status->flush_inputs_to_zero) { 4761 FloatParts64 p; 4762 4763 float16_unpack_raw(&p, a); 4764 if (parts_squash_denormal(p, status)) { 4765 return float16_set_sign(float16_zero, p.sign); 4766 } 4767 } 4768 return a; 4769 } 4770 4771 float32 float32_squash_input_denormal(float32 a, float_status *status) 4772 { 4773 if (status->flush_inputs_to_zero) { 4774 FloatParts64 p; 4775 4776 float32_unpack_raw(&p, a); 4777 if (parts_squash_denormal(p, status)) { 4778 return float32_set_sign(float32_zero, p.sign); 4779 } 4780 } 4781 return a; 4782 } 4783 4784 float64 float64_squash_input_denormal(float64 a, float_status *status) 4785 { 4786 if (status->flush_inputs_to_zero) { 4787 FloatParts64 p; 4788 4789 float64_unpack_raw(&p, a); 4790 if (parts_squash_denormal(p, status)) { 4791 return float64_set_sign(float64_zero, p.sign); 4792 } 4793 } 4794 return a; 4795 } 4796 4797 bfloat16 bfloat16_squash_input_denormal(bfloat16 a, float_status *status) 4798 { 4799 if (status->flush_inputs_to_zero) { 4800 FloatParts64 p; 4801 4802 bfloat16_unpack_raw(&p, a); 4803 if (parts_squash_denormal(p, status)) { 4804 return bfloat16_set_sign(bfloat16_zero, p.sign); 4805 } 4806 } 4807 return a; 4808 } 4809 4810 /*---------------------------------------------------------------------------- 4811 | Normalizes the subnormal extended double-precision floating-point value 4812 | represented by the denormalized significand `aSig'. The normalized exponent 4813 | and significand are stored at the locations pointed to by `zExpPtr' and 4814 | `zSigPtr', respectively. 4815 *----------------------------------------------------------------------------*/ 4816 4817 void normalizeFloatx80Subnormal(uint64_t aSig, int32_t *zExpPtr, 4818 uint64_t *zSigPtr) 4819 { 4820 int8_t shiftCount; 4821 4822 shiftCount = clz64(aSig); 4823 *zSigPtr = aSig<<shiftCount; 4824 *zExpPtr = 1 - shiftCount; 4825 } 4826 4827 /*---------------------------------------------------------------------------- 4828 | Takes an abstract floating-point value having sign `zSign', exponent `zExp', 4829 | and extended significand formed by the concatenation of `zSig0' and `zSig1', 4830 | and returns the proper extended double-precision floating-point value 4831 | corresponding to the abstract input. Ordinarily, the abstract value is 4832 | rounded and packed into the extended double-precision format, with the 4833 | inexact exception raised if the abstract input cannot be represented 4834 | exactly. However, if the abstract value is too large, the overflow and 4835 | inexact exceptions are raised and an infinity or maximal finite value is 4836 | returned. If the abstract value is too small, the input value is rounded to 4837 | a subnormal number, and the underflow and inexact exceptions are raised if 4838 | the abstract input cannot be represented exactly as a subnormal extended 4839 | double-precision floating-point number. 4840 | If `roundingPrecision' is floatx80_precision_s or floatx80_precision_d, 4841 | the result is rounded to the same number of bits as single or double 4842 | precision, respectively. Otherwise, the result is rounded to the full 4843 | precision of the extended double-precision format. 4844 | The input significand must be normalized or smaller. If the input 4845 | significand is not normalized, `zExp' must be 0; in that case, the result 4846 | returned is a subnormal number, and it must not require rounding. The 4847 | handling of underflow and overflow follows the IEC/IEEE Standard for Binary 4848 | Floating-Point Arithmetic. 4849 *----------------------------------------------------------------------------*/ 4850 4851 floatx80 roundAndPackFloatx80(FloatX80RoundPrec roundingPrecision, bool zSign, 4852 int32_t zExp, uint64_t zSig0, uint64_t zSig1, 4853 float_status *status) 4854 { 4855 FloatRoundMode roundingMode; 4856 bool roundNearestEven, increment, isTiny; 4857 int64_t roundIncrement, roundMask, roundBits; 4858 4859 roundingMode = status->float_rounding_mode; 4860 roundNearestEven = ( roundingMode == float_round_nearest_even ); 4861 switch (roundingPrecision) { 4862 case floatx80_precision_x: 4863 goto precision80; 4864 case floatx80_precision_d: 4865 roundIncrement = UINT64_C(0x0000000000000400); 4866 roundMask = UINT64_C(0x00000000000007FF); 4867 break; 4868 case floatx80_precision_s: 4869 roundIncrement = UINT64_C(0x0000008000000000); 4870 roundMask = UINT64_C(0x000000FFFFFFFFFF); 4871 break; 4872 default: 4873 g_assert_not_reached(); 4874 } 4875 zSig0 |= ( zSig1 != 0 ); 4876 switch (roundingMode) { 4877 case float_round_nearest_even: 4878 case float_round_ties_away: 4879 break; 4880 case float_round_to_zero: 4881 roundIncrement = 0; 4882 break; 4883 case float_round_up: 4884 roundIncrement = zSign ? 0 : roundMask; 4885 break; 4886 case float_round_down: 4887 roundIncrement = zSign ? roundMask : 0; 4888 break; 4889 default: 4890 abort(); 4891 } 4892 roundBits = zSig0 & roundMask; 4893 if ( 0x7FFD <= (uint32_t) ( zExp - 1 ) ) { 4894 if ( ( 0x7FFE < zExp ) 4895 || ( ( zExp == 0x7FFE ) && ( zSig0 + roundIncrement < zSig0 ) ) 4896 ) { 4897 goto overflow; 4898 } 4899 if ( zExp <= 0 ) { 4900 if (status->flush_to_zero) { 4901 float_raise(float_flag_output_denormal, status); 4902 return packFloatx80(zSign, 0, 0); 4903 } 4904 isTiny = status->tininess_before_rounding 4905 || (zExp < 0 ) 4906 || (zSig0 <= zSig0 + roundIncrement); 4907 shift64RightJamming( zSig0, 1 - zExp, &zSig0 ); 4908 zExp = 0; 4909 roundBits = zSig0 & roundMask; 4910 if (isTiny && roundBits) { 4911 float_raise(float_flag_underflow, status); 4912 } 4913 if (roundBits) { 4914 float_raise(float_flag_inexact, status); 4915 } 4916 zSig0 += roundIncrement; 4917 if ( (int64_t) zSig0 < 0 ) zExp = 1; 4918 roundIncrement = roundMask + 1; 4919 if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) { 4920 roundMask |= roundIncrement; 4921 } 4922 zSig0 &= ~ roundMask; 4923 return packFloatx80( zSign, zExp, zSig0 ); 4924 } 4925 } 4926 if (roundBits) { 4927 float_raise(float_flag_inexact, status); 4928 } 4929 zSig0 += roundIncrement; 4930 if ( zSig0 < roundIncrement ) { 4931 ++zExp; 4932 zSig0 = UINT64_C(0x8000000000000000); 4933 } 4934 roundIncrement = roundMask + 1; 4935 if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) { 4936 roundMask |= roundIncrement; 4937 } 4938 zSig0 &= ~ roundMask; 4939 if ( zSig0 == 0 ) zExp = 0; 4940 return packFloatx80( zSign, zExp, zSig0 ); 4941 precision80: 4942 switch (roundingMode) { 4943 case float_round_nearest_even: 4944 case float_round_ties_away: 4945 increment = ((int64_t)zSig1 < 0); 4946 break; 4947 case float_round_to_zero: 4948 increment = 0; 4949 break; 4950 case float_round_up: 4951 increment = !zSign && zSig1; 4952 break; 4953 case float_round_down: 4954 increment = zSign && zSig1; 4955 break; 4956 default: 4957 abort(); 4958 } 4959 if ( 0x7FFD <= (uint32_t) ( zExp - 1 ) ) { 4960 if ( ( 0x7FFE < zExp ) 4961 || ( ( zExp == 0x7FFE ) 4962 && ( zSig0 == UINT64_C(0xFFFFFFFFFFFFFFFF) ) 4963 && increment 4964 ) 4965 ) { 4966 roundMask = 0; 4967 overflow: 4968 float_raise(float_flag_overflow | float_flag_inexact, status); 4969 if ( ( roundingMode == float_round_to_zero ) 4970 || ( zSign && ( roundingMode == float_round_up ) ) 4971 || ( ! zSign && ( roundingMode == float_round_down ) ) 4972 ) { 4973 return packFloatx80( zSign, 0x7FFE, ~ roundMask ); 4974 } 4975 return packFloatx80(zSign, 4976 floatx80_infinity_high, 4977 floatx80_infinity_low); 4978 } 4979 if ( zExp <= 0 ) { 4980 isTiny = status->tininess_before_rounding 4981 || (zExp < 0) 4982 || !increment 4983 || (zSig0 < UINT64_C(0xFFFFFFFFFFFFFFFF)); 4984 shift64ExtraRightJamming( zSig0, zSig1, 1 - zExp, &zSig0, &zSig1 ); 4985 zExp = 0; 4986 if (isTiny && zSig1) { 4987 float_raise(float_flag_underflow, status); 4988 } 4989 if (zSig1) { 4990 float_raise(float_flag_inexact, status); 4991 } 4992 switch (roundingMode) { 4993 case float_round_nearest_even: 4994 case float_round_ties_away: 4995 increment = ((int64_t)zSig1 < 0); 4996 break; 4997 case float_round_to_zero: 4998 increment = 0; 4999 break; 5000 case float_round_up: 5001 increment = !zSign && zSig1; 5002 break; 5003 case float_round_down: 5004 increment = zSign && zSig1; 5005 break; 5006 default: 5007 abort(); 5008 } 5009 if ( increment ) { 5010 ++zSig0; 5011 if (!(zSig1 << 1) && roundNearestEven) { 5012 zSig0 &= ~1; 5013 } 5014 if ( (int64_t) zSig0 < 0 ) zExp = 1; 5015 } 5016 return packFloatx80( zSign, zExp, zSig0 ); 5017 } 5018 } 5019 if (zSig1) { 5020 float_raise(float_flag_inexact, status); 5021 } 5022 if ( increment ) { 5023 ++zSig0; 5024 if ( zSig0 == 0 ) { 5025 ++zExp; 5026 zSig0 = UINT64_C(0x8000000000000000); 5027 } 5028 else { 5029 if (!(zSig1 << 1) && roundNearestEven) { 5030 zSig0 &= ~1; 5031 } 5032 } 5033 } 5034 else { 5035 if ( zSig0 == 0 ) zExp = 0; 5036 } 5037 return packFloatx80( zSign, zExp, zSig0 ); 5038 5039 } 5040 5041 /*---------------------------------------------------------------------------- 5042 | Takes an abstract floating-point value having sign `zSign', exponent 5043 | `zExp', and significand formed by the concatenation of `zSig0' and `zSig1', 5044 | and returns the proper extended double-precision floating-point value 5045 | corresponding to the abstract input. This routine is just like 5046 | `roundAndPackFloatx80' except that the input significand does not have to be 5047 | normalized. 5048 *----------------------------------------------------------------------------*/ 5049 5050 floatx80 normalizeRoundAndPackFloatx80(FloatX80RoundPrec roundingPrecision, 5051 bool zSign, int32_t zExp, 5052 uint64_t zSig0, uint64_t zSig1, 5053 float_status *status) 5054 { 5055 int8_t shiftCount; 5056 5057 if ( zSig0 == 0 ) { 5058 zSig0 = zSig1; 5059 zSig1 = 0; 5060 zExp -= 64; 5061 } 5062 shiftCount = clz64(zSig0); 5063 shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 ); 5064 zExp -= shiftCount; 5065 return roundAndPackFloatx80(roundingPrecision, zSign, zExp, 5066 zSig0, zSig1, status); 5067 5068 } 5069 5070 /*---------------------------------------------------------------------------- 5071 | Returns the binary exponential of the single-precision floating-point value 5072 | `a'. The operation is performed according to the IEC/IEEE Standard for 5073 | Binary Floating-Point Arithmetic. 5074 | 5075 | Uses the following identities: 5076 | 5077 | 1. ------------------------------------------------------------------------- 5078 | x x*ln(2) 5079 | 2 = e 5080 | 5081 | 2. ------------------------------------------------------------------------- 5082 | 2 3 4 5 n 5083 | x x x x x x x 5084 | e = 1 + --- + --- + --- + --- + --- + ... + --- + ... 5085 | 1! 2! 3! 4! 5! n! 5086 *----------------------------------------------------------------------------*/ 5087 5088 static const float64 float32_exp2_coefficients[15] = 5089 { 5090 const_float64( 0x3ff0000000000000ll ), /* 1 */ 5091 const_float64( 0x3fe0000000000000ll ), /* 2 */ 5092 const_float64( 0x3fc5555555555555ll ), /* 3 */ 5093 const_float64( 0x3fa5555555555555ll ), /* 4 */ 5094 const_float64( 0x3f81111111111111ll ), /* 5 */ 5095 const_float64( 0x3f56c16c16c16c17ll ), /* 6 */ 5096 const_float64( 0x3f2a01a01a01a01all ), /* 7 */ 5097 const_float64( 0x3efa01a01a01a01all ), /* 8 */ 5098 const_float64( 0x3ec71de3a556c734ll ), /* 9 */ 5099 const_float64( 0x3e927e4fb7789f5cll ), /* 10 */ 5100 const_float64( 0x3e5ae64567f544e4ll ), /* 11 */ 5101 const_float64( 0x3e21eed8eff8d898ll ), /* 12 */ 5102 const_float64( 0x3de6124613a86d09ll ), /* 13 */ 5103 const_float64( 0x3da93974a8c07c9dll ), /* 14 */ 5104 const_float64( 0x3d6ae7f3e733b81fll ), /* 15 */ 5105 }; 5106 5107 float32 float32_exp2(float32 a, float_status *status) 5108 { 5109 FloatParts64 xp, xnp, tp, rp; 5110 int i; 5111 5112 float32_unpack_canonical(&xp, a, status); 5113 if (unlikely(xp.cls != float_class_normal)) { 5114 switch (xp.cls) { 5115 case float_class_snan: 5116 case float_class_qnan: 5117 parts_return_nan(&xp, status); 5118 return float32_round_pack_canonical(&xp, status); 5119 case float_class_inf: 5120 return xp.sign ? float32_zero : a; 5121 case float_class_zero: 5122 return float32_one; 5123 default: 5124 break; 5125 } 5126 g_assert_not_reached(); 5127 } 5128 5129 float_raise(float_flag_inexact, status); 5130 5131 float64_unpack_canonical(&tp, float64_ln2, status); 5132 xp = *parts_mul(&xp, &tp, status); 5133 xnp = xp; 5134 5135 float64_unpack_canonical(&rp, float64_one, status); 5136 for (i = 0 ; i < 15 ; i++) { 5137 float64_unpack_canonical(&tp, float32_exp2_coefficients[i], status); 5138 rp = *parts_muladd(&tp, &xnp, &rp, 0, status); 5139 xnp = *parts_mul(&xnp, &xp, status); 5140 } 5141 5142 return float32_round_pack_canonical(&rp, status); 5143 } 5144 5145 /*---------------------------------------------------------------------------- 5146 | Rounds the extended double-precision floating-point value `a' 5147 | to the precision provided by floatx80_rounding_precision and returns the 5148 | result as an extended double-precision floating-point value. 5149 | The operation is performed according to the IEC/IEEE Standard for Binary 5150 | Floating-Point Arithmetic. 5151 *----------------------------------------------------------------------------*/ 5152 5153 floatx80 floatx80_round(floatx80 a, float_status *status) 5154 { 5155 FloatParts128 p; 5156 5157 if (!floatx80_unpack_canonical(&p, a, status)) { 5158 return floatx80_default_nan(status); 5159 } 5160 return floatx80_round_pack_canonical(&p, status); 5161 } 5162 5163 static void __attribute__((constructor)) softfloat_init(void) 5164 { 5165 union_float64 ua, ub, uc, ur; 5166 5167 if (QEMU_NO_HARDFLOAT) { 5168 return; 5169 } 5170 /* 5171 * Test that the host's FMA is not obviously broken. For example, 5172 * glibc < 2.23 can perform an incorrect FMA on certain hosts; see 5173 * https://sourceware.org/bugzilla/show_bug.cgi?id=13304 5174 */ 5175 ua.s = 0x0020000000000001ULL; 5176 ub.s = 0x3ca0000000000000ULL; 5177 uc.s = 0x0020000000000000ULL; 5178 ur.h = fma(ua.h, ub.h, uc.h); 5179 if (ur.s != 0x0020000000000001ULL) { 5180 force_soft_fma = true; 5181 } 5182 } 5183