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