migration/tls: extract cleanup function for common-use
[qemu/ar7.git] / fpu / softfloat-specialize.c.inc
blobc2f87addb254900b43bde6705119e274fe2642e0
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  */
19 ===============================================================================
20 This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
21 Arithmetic Package, Release 2a.
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'.
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.
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.
44 ===============================================================================
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  */
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  */
83  * Define whether architecture deviates from IEEE in not supporting
84  * signaling NaNs (so all NaNs are treated as quiet).
85  */
86 static inline bool no_signaling_nans(float_status *status)
88 #if defined(TARGET_XTENSA)
89     return status->no_signaling_nans;
90 #else
91     return false;
92 #endif
95 /* Define how the architecture discriminates signaling NaNs.
96  * This done with the most significant bit of the fraction.
97  * In IEEE 754-1985 this was implementation defined, but in IEEE 754-2008
98  * the msb must be zero.  MIPS is (so far) unique in supporting both the
99  * 2008 revision and backward compatibility with their original choice.
100  * Thus for MIPS we must make the choice at runtime.
101  */
102 static inline bool snan_bit_is_one(float_status *status)
104 #if defined(TARGET_MIPS)
105     return status->snan_bit_is_one;
106 #elif defined(TARGET_HPPA) || defined(TARGET_UNICORE32) || defined(TARGET_SH4)
107     return 1;
108 #else
109     return 0;
110 #endif
113 /*----------------------------------------------------------------------------
114 | For the deconstructed floating-point with fraction FRAC, return true
115 | if the fraction represents a signalling NaN; otherwise false.
116 *----------------------------------------------------------------------------*/
118 static bool parts_is_snan_frac(uint64_t frac, float_status *status)
120     if (no_signaling_nans(status)) {
121         return false;
122     } else {
123         bool msb = extract64(frac, DECOMPOSED_BINARY_POINT - 1, 1);
124         return msb == snan_bit_is_one(status);
125     }
128 /*----------------------------------------------------------------------------
129 | The pattern for a default generated deconstructed floating-point NaN.
130 *----------------------------------------------------------------------------*/
132 static FloatParts parts_default_nan(float_status *status)
134     bool sign = 0;
135     uint64_t frac;
137 #if defined(TARGET_SPARC) || defined(TARGET_M68K)
138     /* !snan_bit_is_one, set all bits */
139     frac = (1ULL << DECOMPOSED_BINARY_POINT) - 1;
140 #elif defined(TARGET_I386) || defined(TARGET_X86_64) \
141     || defined(TARGET_MICROBLAZE)
142     /* !snan_bit_is_one, set sign and msb */
143     frac = 1ULL << (DECOMPOSED_BINARY_POINT - 1);
144     sign = 1;
145 #elif defined(TARGET_HPPA)
146     /* snan_bit_is_one, set msb-1.  */
147     frac = 1ULL << (DECOMPOSED_BINARY_POINT - 2);
148 #else
149     /* This case is true for Alpha, ARM, MIPS, OpenRISC, PPC, RISC-V,
150      * S390, SH4, TriCore, and Xtensa.  I cannot find documentation
151      * for Unicore32; the choice from the original commit is unchanged.
152      * Our other supported targets, CRIS, LM32, Moxie, Nios2, and Tile,
153      * do not have floating-point.
154      */
155     if (snan_bit_is_one(status)) {
156         /* set all bits other than msb */
157         frac = (1ULL << (DECOMPOSED_BINARY_POINT - 1)) - 1;
158     } else {
159         /* set msb */
160         frac = 1ULL << (DECOMPOSED_BINARY_POINT - 1);
161     }
162 #endif
164     return (FloatParts) {
165         .cls = float_class_qnan,
166         .sign = sign,
167         .exp = INT_MAX,
168         .frac = frac
169     };
172 /*----------------------------------------------------------------------------
173 | Returns a quiet NaN from a signalling NaN for the deconstructed
174 | floating-point parts.
175 *----------------------------------------------------------------------------*/
177 static FloatParts parts_silence_nan(FloatParts a, float_status *status)
179     g_assert(!no_signaling_nans(status));
180 #if defined(TARGET_HPPA)
181     a.frac &= ~(1ULL << (DECOMPOSED_BINARY_POINT - 1));
182     a.frac |= 1ULL << (DECOMPOSED_BINARY_POINT - 2);
183 #else
184     if (snan_bit_is_one(status)) {
185         return parts_default_nan(status);
186     } else {
187         a.frac |= 1ULL << (DECOMPOSED_BINARY_POINT - 1);
188     }
189 #endif
190     a.cls = float_class_qnan;
191     return a;
194 /*----------------------------------------------------------------------------
195 | The pattern for a default generated extended double-precision NaN.
196 *----------------------------------------------------------------------------*/
197 floatx80 floatx80_default_nan(float_status *status)
199     floatx80 r;
201     /* None of the targets that have snan_bit_is_one use floatx80.  */
202     assert(!snan_bit_is_one(status));
203 #if defined(TARGET_M68K)
204     r.low = UINT64_C(0xFFFFFFFFFFFFFFFF);
205     r.high = 0x7FFF;
206 #else
207     /* X86 */
208     r.low = UINT64_C(0xC000000000000000);
209     r.high = 0xFFFF;
210 #endif
211     return r;
214 /*----------------------------------------------------------------------------
215 | The pattern for a default generated extended double-precision inf.
216 *----------------------------------------------------------------------------*/
218 #define floatx80_infinity_high 0x7FFF
219 #if defined(TARGET_M68K)
220 #define floatx80_infinity_low  UINT64_C(0x0000000000000000)
221 #else
222 #define floatx80_infinity_low  UINT64_C(0x8000000000000000)
223 #endif
225 const floatx80 floatx80_infinity
226     = make_floatx80_init(floatx80_infinity_high, floatx80_infinity_low);
228 /*----------------------------------------------------------------------------
229 | Raises the exceptions specified by `flags'.  Floating-point traps can be
230 | defined here if desired.  It is currently not possible for such a trap
231 | to substitute a result value.  If traps are not implemented, this routine
232 | should be simply `float_exception_flags |= flags;'.
233 *----------------------------------------------------------------------------*/
235 void float_raise(uint8_t flags, float_status *status)
237     status->float_exception_flags |= flags;
240 /*----------------------------------------------------------------------------
241 | Internal canonical NaN format.
242 *----------------------------------------------------------------------------*/
243 typedef struct {
244     bool sign;
245     uint64_t high, low;
246 } commonNaNT;
248 /*----------------------------------------------------------------------------
249 | Returns 1 if the half-precision floating-point value `a' is a quiet
250 | NaN; otherwise returns 0.
251 *----------------------------------------------------------------------------*/
253 bool float16_is_quiet_nan(float16 a_, float_status *status)
255     if (no_signaling_nans(status)) {
256         return float16_is_any_nan(a_);
257     } else {
258         uint16_t a = float16_val(a_);
259         if (snan_bit_is_one(status)) {
260             return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
261         } else {
263             return ((a >> 9) & 0x3F) == 0x3F;
264         }
265     }
268 /*----------------------------------------------------------------------------
269 | Returns 1 if the bfloat16 value `a' is a quiet
270 | NaN; otherwise returns 0.
271 *----------------------------------------------------------------------------*/
273 bool bfloat16_is_quiet_nan(bfloat16 a_, float_status *status)
275     if (no_signaling_nans(status)) {
276         return bfloat16_is_any_nan(a_);
277     } else {
278         uint16_t a = a_;
279         if (snan_bit_is_one(status)) {
280             return (((a >> 6) & 0x1FF) == 0x1FE) && (a & 0x3F);
281         } else {
282             return ((a >> 6) & 0x1FF) == 0x1FF;
283         }
284     }
287 /*----------------------------------------------------------------------------
288 | Returns 1 if the half-precision floating-point value `a' is a signaling
289 | NaN; otherwise returns 0.
290 *----------------------------------------------------------------------------*/
292 bool float16_is_signaling_nan(float16 a_, float_status *status)
294     if (no_signaling_nans(status)) {
295         return 0;
296     } else {
297         uint16_t a = float16_val(a_);
298         if (snan_bit_is_one(status)) {
299             return ((a >> 9) & 0x3F) == 0x3F;
300         } else {
301             return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
302         }
303     }
306 /*----------------------------------------------------------------------------
307 | Returns 1 if the bfloat16 value `a' is a signaling
308 | NaN; otherwise returns 0.
309 *----------------------------------------------------------------------------*/
311 bool bfloat16_is_signaling_nan(bfloat16 a_, float_status *status)
313     if (no_signaling_nans(status)) {
314         return 0;
315     } else {
316         uint16_t a = a_;
317         if (snan_bit_is_one(status)) {
318             return ((a >> 6) & 0x1FF) == 0x1FF;
319         } else {
320             return (((a >> 6) & 0x1FF) == 0x1FE) && (a & 0x3F);
321         }
322     }
325 /*----------------------------------------------------------------------------
326 | Returns 1 if the single-precision floating-point value `a' is a quiet
327 | NaN; otherwise returns 0.
328 *----------------------------------------------------------------------------*/
330 bool float32_is_quiet_nan(float32 a_, float_status *status)
332     if (no_signaling_nans(status)) {
333         return float32_is_any_nan(a_);
334     } else {
335         uint32_t a = float32_val(a_);
336         if (snan_bit_is_one(status)) {
337             return (((a >> 22) & 0x1FF) == 0x1FE) && (a & 0x003FFFFF);
338         } else {
339             return ((uint32_t)(a << 1) >= 0xFF800000);
340         }
341     }
344 /*----------------------------------------------------------------------------
345 | Returns 1 if the single-precision floating-point value `a' is a signaling
346 | NaN; otherwise returns 0.
347 *----------------------------------------------------------------------------*/
349 bool float32_is_signaling_nan(float32 a_, float_status *status)
351     if (no_signaling_nans(status)) {
352         return 0;
353     } else {
354         uint32_t a = float32_val(a_);
355         if (snan_bit_is_one(status)) {
356             return ((uint32_t)(a << 1) >= 0xFF800000);
357         } else {
358             return (((a >> 22) & 0x1FF) == 0x1FE) && (a & 0x003FFFFF);
359         }
360     }
363 /*----------------------------------------------------------------------------
364 | Returns the result of converting the single-precision floating-point NaN
365 | `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
366 | exception is raised.
367 *----------------------------------------------------------------------------*/
369 static commonNaNT float32ToCommonNaN(float32 a, float_status *status)
371     commonNaNT z;
373     if (float32_is_signaling_nan(a, status)) {
374         float_raise(float_flag_invalid, status);
375     }
376     z.sign = float32_val(a) >> 31;
377     z.low = 0;
378     z.high = ((uint64_t)float32_val(a)) << 41;
379     return z;
382 /*----------------------------------------------------------------------------
383 | Returns the result of converting the canonical NaN `a' to the single-
384 | precision floating-point format.
385 *----------------------------------------------------------------------------*/
387 static float32 commonNaNToFloat32(commonNaNT a, float_status *status)
389     uint32_t mantissa = a.high >> 41;
391     if (status->default_nan_mode) {
392         return float32_default_nan(status);
393     }
395     if (mantissa) {
396         return make_float32(
397             (((uint32_t)a.sign) << 31) | 0x7F800000 | (a.high >> 41));
398     } else {
399         return float32_default_nan(status);
400     }
403 /*----------------------------------------------------------------------------
404 | Select which NaN to propagate for a two-input operation.
405 | IEEE754 doesn't specify all the details of this, so the
406 | algorithm is target-specific.
407 | The routine is passed various bits of information about the
408 | two NaNs and should return 0 to select NaN a and 1 for NaN b.
409 | Note that signalling NaNs are always squashed to quiet NaNs
410 | by the caller, by calling floatXX_silence_nan() before
411 | returning them.
413 | aIsLargerSignificand is only valid if both a and b are NaNs
414 | of some kind, and is true if a has the larger significand,
415 | or if both a and b have the same significand but a is
416 | positive but b is negative. It is only needed for the x87
417 | tie-break rule.
418 *----------------------------------------------------------------------------*/
420 static int pickNaN(FloatClass a_cls, FloatClass b_cls,
421                    bool aIsLargerSignificand, float_status *status)
423 #if defined(TARGET_ARM) || defined(TARGET_MIPS) || defined(TARGET_HPPA)
424     /* ARM mandated NaN propagation rules (see FPProcessNaNs()), take
425      * the first of:
426      *  1. A if it is signaling
427      *  2. B if it is signaling
428      *  3. A (quiet)
429      *  4. B (quiet)
430      * A signaling NaN is always quietened before returning it.
431      */
432     /* According to MIPS specifications, if one of the two operands is
433      * a sNaN, a new qNaN has to be generated. This is done in
434      * floatXX_silence_nan(). For qNaN inputs the specifications
435      * says: "When possible, this QNaN result is one of the operand QNaN
436      * values." In practice it seems that most implementations choose
437      * the first operand if both operands are qNaN. In short this gives
438      * the following rules:
439      *  1. A if it is signaling
440      *  2. B if it is signaling
441      *  3. A (quiet)
442      *  4. B (quiet)
443      * A signaling NaN is always silenced before returning it.
444      */
445     if (is_snan(a_cls)) {
446         return 0;
447     } else if (is_snan(b_cls)) {
448         return 1;
449     } else if (is_qnan(a_cls)) {
450         return 0;
451     } else {
452         return 1;
453     }
454 #elif defined(TARGET_PPC) || defined(TARGET_M68K)
455     /* PowerPC propagation rules:
456      *  1. A if it sNaN or qNaN
457      *  2. B if it sNaN or qNaN
458      * A signaling NaN is always silenced before returning it.
459      */
460     /* M68000 FAMILY PROGRAMMER'S REFERENCE MANUAL
461      * 3.4 FLOATING-POINT INSTRUCTION DETAILS
462      * If either operand, but not both operands, of an operation is a
463      * nonsignaling NaN, then that NaN is returned as the result. If both
464      * operands are nonsignaling NaNs, then the destination operand
465      * nonsignaling NaN is returned as the result.
466      * If either operand to an operation is a signaling NaN (SNaN), then the
467      * SNaN bit is set in the FPSR EXC byte. If the SNaN exception enable bit
468      * is set in the FPCR ENABLE byte, then the exception is taken and the
469      * destination is not modified. If the SNaN exception enable bit is not
470      * set, setting the SNaN bit in the operand to a one converts the SNaN to
471      * a nonsignaling NaN. The operation then continues as described in the
472      * preceding paragraph for nonsignaling NaNs.
473      */
474     if (is_nan(a_cls)) {
475         return 0;
476     } else {
477         return 1;
478     }
479 #elif defined(TARGET_XTENSA)
480     /*
481      * Xtensa has two NaN propagation modes.
482      * Which one is active is controlled by float_status::use_first_nan.
483      */
484     if (status->use_first_nan) {
485         if (is_nan(a_cls)) {
486             return 0;
487         } else {
488             return 1;
489         }
490     } else {
491         if (is_nan(b_cls)) {
492             return 1;
493         } else {
494             return 0;
495         }
496     }
497 #else
498     /* This implements x87 NaN propagation rules:
499      * SNaN + QNaN => return the QNaN
500      * two SNaNs => return the one with the larger significand, silenced
501      * two QNaNs => return the one with the larger significand
502      * SNaN and a non-NaN => return the SNaN, silenced
503      * QNaN and a non-NaN => return the QNaN
504      *
505      * If we get down to comparing significands and they are the same,
506      * return the NaN with the positive sign bit (if any).
507      */
508     if (is_snan(a_cls)) {
509         if (is_snan(b_cls)) {
510             return aIsLargerSignificand ? 0 : 1;
511         }
512         return is_qnan(b_cls) ? 1 : 0;
513     } else if (is_qnan(a_cls)) {
514         if (is_snan(b_cls) || !is_qnan(b_cls)) {
515             return 0;
516         } else {
517             return aIsLargerSignificand ? 0 : 1;
518         }
519     } else {
520         return 1;
521     }
522 #endif
525 /*----------------------------------------------------------------------------
526 | Select which NaN to propagate for a three-input operation.
527 | For the moment we assume that no CPU needs the 'larger significand'
528 | information.
529 | Return values : 0 : a; 1 : b; 2 : c; 3 : default-NaN
530 *----------------------------------------------------------------------------*/
531 static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
532                          bool infzero, float_status *status)
534 #if defined(TARGET_ARM)
535     /* For ARM, the (inf,zero,qnan) case sets InvalidOp and returns
536      * the default NaN
537      */
538     if (infzero && is_qnan(c_cls)) {
539         float_raise(float_flag_invalid, status);
540         return 3;
541     }
543     /* This looks different from the ARM ARM pseudocode, because the ARM ARM
544      * puts the operands to a fused mac operation (a*b)+c in the order c,a,b.
545      */
546     if (is_snan(c_cls)) {
547         return 2;
548     } else if (is_snan(a_cls)) {
549         return 0;
550     } else if (is_snan(b_cls)) {
551         return 1;
552     } else if (is_qnan(c_cls)) {
553         return 2;
554     } else if (is_qnan(a_cls)) {
555         return 0;
556     } else {
557         return 1;
558     }
559 #elif defined(TARGET_MIPS)
560     if (snan_bit_is_one(status)) {
561         /*
562          * For MIPS systems that conform to IEEE754-1985, the (inf,zero,nan)
563          * case sets InvalidOp and returns the default NaN
564          */
565         if (infzero) {
566             float_raise(float_flag_invalid, status);
567             return 3;
568         }
569         /* Prefer sNaN over qNaN, in the a, b, c order. */
570         if (is_snan(a_cls)) {
571             return 0;
572         } else if (is_snan(b_cls)) {
573             return 1;
574         } else if (is_snan(c_cls)) {
575             return 2;
576         } else if (is_qnan(a_cls)) {
577             return 0;
578         } else if (is_qnan(b_cls)) {
579             return 1;
580         } else {
581             return 2;
582         }
583     } else {
584         /*
585          * For MIPS systems that conform to IEEE754-2008, the (inf,zero,nan)
586          * case sets InvalidOp and returns the input value 'c'
587          */
588         if (infzero) {
589             float_raise(float_flag_invalid, status);
590             return 2;
591         }
592         /* Prefer sNaN over qNaN, in the c, a, b order. */
593         if (is_snan(c_cls)) {
594             return 2;
595         } else if (is_snan(a_cls)) {
596             return 0;
597         } else if (is_snan(b_cls)) {
598             return 1;
599         } else if (is_qnan(c_cls)) {
600             return 2;
601         } else if (is_qnan(a_cls)) {
602             return 0;
603         } else {
604             return 1;
605         }
606     }
607 #elif defined(TARGET_PPC)
608     /* For PPC, the (inf,zero,qnan) case sets InvalidOp, but we prefer
609      * to return an input NaN if we have one (ie c) rather than generating
610      * a default NaN
611      */
612     if (infzero) {
613         float_raise(float_flag_invalid, status);
614         return 2;
615     }
617     /* If fRA is a NaN return it; otherwise if fRB is a NaN return it;
618      * otherwise return fRC. Note that muladd on PPC is (fRA * fRC) + frB
619      */
620     if (is_nan(a_cls)) {
621         return 0;
622     } else if (is_nan(c_cls)) {
623         return 2;
624     } else {
625         return 1;
626     }
627 #elif defined(TARGET_XTENSA)
628     /*
629      * For Xtensa, the (inf,zero,nan) case sets InvalidOp and returns
630      * an input NaN if we have one (ie c).
631      */
632     if (infzero) {
633         float_raise(float_flag_invalid, status);
634         return 2;
635     }
636     if (status->use_first_nan) {
637         if (is_nan(a_cls)) {
638             return 0;
639         } else if (is_nan(b_cls)) {
640             return 1;
641         } else {
642             return 2;
643         }
644     } else {
645         if (is_nan(c_cls)) {
646             return 2;
647         } else if (is_nan(b_cls)) {
648             return 1;
649         } else {
650             return 0;
651         }
652     }
653 #else
654     /* A default implementation: prefer a to b to c.
655      * This is unlikely to actually match any real implementation.
656      */
657     if (is_nan(a_cls)) {
658         return 0;
659     } else if (is_nan(b_cls)) {
660         return 1;
661     } else {
662         return 2;
663     }
664 #endif
667 /*----------------------------------------------------------------------------
668 | Takes two single-precision floating-point values `a' and `b', one of which
669 | is a NaN, and returns the appropriate NaN result.  If either `a' or `b' is a
670 | signaling NaN, the invalid exception is raised.
671 *----------------------------------------------------------------------------*/
673 static float32 propagateFloat32NaN(float32 a, float32 b, float_status *status)
675     bool aIsLargerSignificand;
676     uint32_t av, bv;
677     FloatClass a_cls, b_cls;
679     /* This is not complete, but is good enough for pickNaN.  */
680     a_cls = (!float32_is_any_nan(a)
681              ? float_class_normal
682              : float32_is_signaling_nan(a, status)
683              ? float_class_snan
684              : float_class_qnan);
685     b_cls = (!float32_is_any_nan(b)
686              ? float_class_normal
687              : float32_is_signaling_nan(b, status)
688              ? float_class_snan
689              : float_class_qnan);
691     av = float32_val(a);
692     bv = float32_val(b);
694     if (is_snan(a_cls) || is_snan(b_cls)) {
695         float_raise(float_flag_invalid, status);
696     }
698     if (status->default_nan_mode) {
699         return float32_default_nan(status);
700     }
702     if ((uint32_t)(av << 1) < (uint32_t)(bv << 1)) {
703         aIsLargerSignificand = 0;
704     } else if ((uint32_t)(bv << 1) < (uint32_t)(av << 1)) {
705         aIsLargerSignificand = 1;
706     } else {
707         aIsLargerSignificand = (av < bv) ? 1 : 0;
708     }
710     if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
711         if (is_snan(b_cls)) {
712             return float32_silence_nan(b, status);
713         }
714         return b;
715     } else {
716         if (is_snan(a_cls)) {
717             return float32_silence_nan(a, status);
718         }
719         return a;
720     }
723 /*----------------------------------------------------------------------------
724 | Returns 1 if the double-precision floating-point value `a' is a quiet
725 | NaN; otherwise returns 0.
726 *----------------------------------------------------------------------------*/
728 bool float64_is_quiet_nan(float64 a_, float_status *status)
730     if (no_signaling_nans(status)) {
731         return float64_is_any_nan(a_);
732     } else {
733         uint64_t a = float64_val(a_);
734         if (snan_bit_is_one(status)) {
735             return (((a >> 51) & 0xFFF) == 0xFFE)
736                 && (a & 0x0007FFFFFFFFFFFFULL);
737         } else {
738             return ((a << 1) >= 0xFFF0000000000000ULL);
739         }
740     }
743 /*----------------------------------------------------------------------------
744 | Returns 1 if the double-precision floating-point value `a' is a signaling
745 | NaN; otherwise returns 0.
746 *----------------------------------------------------------------------------*/
748 bool float64_is_signaling_nan(float64 a_, float_status *status)
750     if (no_signaling_nans(status)) {
751         return 0;
752     } else {
753         uint64_t a = float64_val(a_);
754         if (snan_bit_is_one(status)) {
755             return ((a << 1) >= 0xFFF0000000000000ULL);
756         } else {
757             return (((a >> 51) & 0xFFF) == 0xFFE)
758                 && (a & UINT64_C(0x0007FFFFFFFFFFFF));
759         }
760     }
763 /*----------------------------------------------------------------------------
764 | Returns the result of converting the double-precision floating-point NaN
765 | `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
766 | exception is raised.
767 *----------------------------------------------------------------------------*/
769 static commonNaNT float64ToCommonNaN(float64 a, float_status *status)
771     commonNaNT z;
773     if (float64_is_signaling_nan(a, status)) {
774         float_raise(float_flag_invalid, status);
775     }
776     z.sign = float64_val(a) >> 63;
777     z.low = 0;
778     z.high = float64_val(a) << 12;
779     return z;
782 /*----------------------------------------------------------------------------
783 | Returns the result of converting the canonical NaN `a' to the double-
784 | precision floating-point format.
785 *----------------------------------------------------------------------------*/
787 static float64 commonNaNToFloat64(commonNaNT a, float_status *status)
789     uint64_t mantissa = a.high >> 12;
791     if (status->default_nan_mode) {
792         return float64_default_nan(status);
793     }
795     if (mantissa) {
796         return make_float64(
797               (((uint64_t) a.sign) << 63)
798             | UINT64_C(0x7FF0000000000000)
799             | (a.high >> 12));
800     } else {
801         return float64_default_nan(status);
802     }
805 /*----------------------------------------------------------------------------
806 | Takes two double-precision floating-point values `a' and `b', one of which
807 | is a NaN, and returns the appropriate NaN result.  If either `a' or `b' is a
808 | signaling NaN, the invalid exception is raised.
809 *----------------------------------------------------------------------------*/
811 static float64 propagateFloat64NaN(float64 a, float64 b, float_status *status)
813     bool aIsLargerSignificand;
814     uint64_t av, bv;
815     FloatClass a_cls, b_cls;
817     /* This is not complete, but is good enough for pickNaN.  */
818     a_cls = (!float64_is_any_nan(a)
819              ? float_class_normal
820              : float64_is_signaling_nan(a, status)
821              ? float_class_snan
822              : float_class_qnan);
823     b_cls = (!float64_is_any_nan(b)
824              ? float_class_normal
825              : float64_is_signaling_nan(b, status)
826              ? float_class_snan
827              : float_class_qnan);
829     av = float64_val(a);
830     bv = float64_val(b);
832     if (is_snan(a_cls) || is_snan(b_cls)) {
833         float_raise(float_flag_invalid, status);
834     }
836     if (status->default_nan_mode) {
837         return float64_default_nan(status);
838     }
840     if ((uint64_t)(av << 1) < (uint64_t)(bv << 1)) {
841         aIsLargerSignificand = 0;
842     } else if ((uint64_t)(bv << 1) < (uint64_t)(av << 1)) {
843         aIsLargerSignificand = 1;
844     } else {
845         aIsLargerSignificand = (av < bv) ? 1 : 0;
846     }
848     if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
849         if (is_snan(b_cls)) {
850             return float64_silence_nan(b, status);
851         }
852         return b;
853     } else {
854         if (is_snan(a_cls)) {
855             return float64_silence_nan(a, status);
856         }
857         return a;
858     }
861 /*----------------------------------------------------------------------------
862 | Returns 1 if the extended double-precision floating-point value `a' is a
863 | quiet NaN; otherwise returns 0. This slightly differs from the same
864 | function for other types as floatx80 has an explicit bit.
865 *----------------------------------------------------------------------------*/
867 int floatx80_is_quiet_nan(floatx80 a, float_status *status)
869     if (no_signaling_nans(status)) {
870         return floatx80_is_any_nan(a);
871     } else {
872         if (snan_bit_is_one(status)) {
873             uint64_t aLow;
875             aLow = a.low & ~0x4000000000000000ULL;
876             return ((a.high & 0x7FFF) == 0x7FFF)
877                 && (aLow << 1)
878                 && (a.low == aLow);
879         } else {
880             return ((a.high & 0x7FFF) == 0x7FFF)
881                 && (UINT64_C(0x8000000000000000) <= ((uint64_t)(a.low << 1)));
882         }
883     }
886 /*----------------------------------------------------------------------------
887 | Returns 1 if the extended double-precision floating-point value `a' is a
888 | signaling NaN; otherwise returns 0. This slightly differs from the same
889 | function for other types as floatx80 has an explicit bit.
890 *----------------------------------------------------------------------------*/
892 int floatx80_is_signaling_nan(floatx80 a, float_status *status)
894     if (no_signaling_nans(status)) {
895         return 0;
896     } else {
897         if (snan_bit_is_one(status)) {
898             return ((a.high & 0x7FFF) == 0x7FFF)
899                 && ((a.low << 1) >= 0x8000000000000000ULL);
900         } else {
901             uint64_t aLow;
903             aLow = a.low & ~UINT64_C(0x4000000000000000);
904             return ((a.high & 0x7FFF) == 0x7FFF)
905                 && (uint64_t)(aLow << 1)
906                 && (a.low == aLow);
907         }
908     }
911 /*----------------------------------------------------------------------------
912 | Returns a quiet NaN from a signalling NaN for the extended double-precision
913 | floating point value `a'.
914 *----------------------------------------------------------------------------*/
916 floatx80 floatx80_silence_nan(floatx80 a, float_status *status)
918     /* None of the targets that have snan_bit_is_one use floatx80.  */
919     assert(!snan_bit_is_one(status));
920     a.low |= UINT64_C(0xC000000000000000);
921     return a;
924 /*----------------------------------------------------------------------------
925 | Returns the result of converting the extended double-precision floating-
926 | point NaN `a' to the canonical NaN format.  If `a' is a signaling NaN, the
927 | invalid exception is raised.
928 *----------------------------------------------------------------------------*/
930 static commonNaNT floatx80ToCommonNaN(floatx80 a, float_status *status)
932     floatx80 dflt;
933     commonNaNT z;
935     if (floatx80_is_signaling_nan(a, status)) {
936         float_raise(float_flag_invalid, status);
937     }
938     if (a.low >> 63) {
939         z.sign = a.high >> 15;
940         z.low = 0;
941         z.high = a.low << 1;
942     } else {
943         dflt = floatx80_default_nan(status);
944         z.sign = dflt.high >> 15;
945         z.low = 0;
946         z.high = dflt.low << 1;
947     }
948     return z;
951 /*----------------------------------------------------------------------------
952 | Returns the result of converting the canonical NaN `a' to the extended
953 | double-precision floating-point format.
954 *----------------------------------------------------------------------------*/
956 static floatx80 commonNaNToFloatx80(commonNaNT a, float_status *status)
958     floatx80 z;
960     if (status->default_nan_mode) {
961         return floatx80_default_nan(status);
962     }
964     if (a.high >> 1) {
965         z.low = UINT64_C(0x8000000000000000) | a.high >> 1;
966         z.high = (((uint16_t)a.sign) << 15) | 0x7FFF;
967     } else {
968         z = floatx80_default_nan(status);
969     }
970     return z;
973 /*----------------------------------------------------------------------------
974 | Takes two extended double-precision floating-point values `a' and `b', one
975 | of which is a NaN, and returns the appropriate NaN result.  If either `a' or
976 | `b' is a signaling NaN, the invalid exception is raised.
977 *----------------------------------------------------------------------------*/
979 floatx80 propagateFloatx80NaN(floatx80 a, floatx80 b, float_status *status)
981     bool aIsLargerSignificand;
982     FloatClass a_cls, b_cls;
984     /* This is not complete, but is good enough for pickNaN.  */
985     a_cls = (!floatx80_is_any_nan(a)
986              ? float_class_normal
987              : floatx80_is_signaling_nan(a, status)
988              ? float_class_snan
989              : float_class_qnan);
990     b_cls = (!floatx80_is_any_nan(b)
991              ? float_class_normal
992              : floatx80_is_signaling_nan(b, status)
993              ? float_class_snan
994              : float_class_qnan);
996     if (is_snan(a_cls) || is_snan(b_cls)) {
997         float_raise(float_flag_invalid, status);
998     }
1000     if (status->default_nan_mode) {
1001         return floatx80_default_nan(status);
1002     }
1004     if (a.low < b.low) {
1005         aIsLargerSignificand = 0;
1006     } else if (b.low < a.low) {
1007         aIsLargerSignificand = 1;
1008     } else {
1009         aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
1010     }
1012     if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
1013         if (is_snan(b_cls)) {
1014             return floatx80_silence_nan(b, status);
1015         }
1016         return b;
1017     } else {
1018         if (is_snan(a_cls)) {
1019             return floatx80_silence_nan(a, status);
1020         }
1021         return a;
1022     }
1025 /*----------------------------------------------------------------------------
1026 | Returns 1 if the quadruple-precision floating-point value `a' is a quiet
1027 | NaN; otherwise returns 0.
1028 *----------------------------------------------------------------------------*/
1030 bool float128_is_quiet_nan(float128 a, float_status *status)
1032     if (no_signaling_nans(status)) {
1033         return float128_is_any_nan(a);
1034     } else {
1035         if (snan_bit_is_one(status)) {
1036             return (((a.high >> 47) & 0xFFFF) == 0xFFFE)
1037                 && (a.low || (a.high & 0x00007FFFFFFFFFFFULL));
1038         } else {
1039             return ((a.high << 1) >= 0xFFFF000000000000ULL)
1040                 && (a.low || (a.high & 0x0000FFFFFFFFFFFFULL));
1041         }
1042     }
1045 /*----------------------------------------------------------------------------
1046 | Returns 1 if the quadruple-precision floating-point value `a' is a
1047 | signaling NaN; otherwise returns 0.
1048 *----------------------------------------------------------------------------*/
1050 bool float128_is_signaling_nan(float128 a, float_status *status)
1052     if (no_signaling_nans(status)) {
1053         return 0;
1054     } else {
1055         if (snan_bit_is_one(status)) {
1056             return ((a.high << 1) >= 0xFFFF000000000000ULL)
1057                 && (a.low || (a.high & 0x0000FFFFFFFFFFFFULL));
1058         } else {
1059             return (((a.high >> 47) & 0xFFFF) == 0xFFFE)
1060                 && (a.low || (a.high & UINT64_C(0x00007FFFFFFFFFFF)));
1061         }
1062     }
1065 /*----------------------------------------------------------------------------
1066 | Returns a quiet NaN from a signalling NaN for the quadruple-precision
1067 | floating point value `a'.
1068 *----------------------------------------------------------------------------*/
1070 float128 float128_silence_nan(float128 a, float_status *status)
1072     if (no_signaling_nans(status)) {
1073         g_assert_not_reached();
1074     } else {
1075         if (snan_bit_is_one(status)) {
1076             return float128_default_nan(status);
1077         } else {
1078             a.high |= UINT64_C(0x0000800000000000);
1079             return a;
1080         }
1081     }
1084 /*----------------------------------------------------------------------------
1085 | Returns the result of converting the quadruple-precision floating-point NaN
1086 | `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
1087 | exception is raised.
1088 *----------------------------------------------------------------------------*/
1090 static commonNaNT float128ToCommonNaN(float128 a, float_status *status)
1092     commonNaNT z;
1094     if (float128_is_signaling_nan(a, status)) {
1095         float_raise(float_flag_invalid, status);
1096     }
1097     z.sign = a.high >> 63;
1098     shortShift128Left(a.high, a.low, 16, &z.high, &z.low);
1099     return z;
1102 /*----------------------------------------------------------------------------
1103 | Returns the result of converting the canonical NaN `a' to the quadruple-
1104 | precision floating-point format.
1105 *----------------------------------------------------------------------------*/
1107 static float128 commonNaNToFloat128(commonNaNT a, float_status *status)
1109     float128 z;
1111     if (status->default_nan_mode) {
1112         return float128_default_nan(status);
1113     }
1115     shift128Right(a.high, a.low, 16, &z.high, &z.low);
1116     z.high |= (((uint64_t)a.sign) << 63) | UINT64_C(0x7FFF000000000000);
1117     return z;
1120 /*----------------------------------------------------------------------------
1121 | Takes two quadruple-precision floating-point values `a' and `b', one of
1122 | which is a NaN, and returns the appropriate NaN result.  If either `a' or
1123 | `b' is a signaling NaN, the invalid exception is raised.
1124 *----------------------------------------------------------------------------*/
1126 static float128 propagateFloat128NaN(float128 a, float128 b,
1127                                      float_status *status)
1129     bool aIsLargerSignificand;
1130     FloatClass a_cls, b_cls;
1132     /* This is not complete, but is good enough for pickNaN.  */
1133     a_cls = (!float128_is_any_nan(a)
1134              ? float_class_normal
1135              : float128_is_signaling_nan(a, status)
1136              ? float_class_snan
1137              : float_class_qnan);
1138     b_cls = (!float128_is_any_nan(b)
1139              ? float_class_normal
1140              : float128_is_signaling_nan(b, status)
1141              ? float_class_snan
1142              : float_class_qnan);
1144     if (is_snan(a_cls) || is_snan(b_cls)) {
1145         float_raise(float_flag_invalid, status);
1146     }
1148     if (status->default_nan_mode) {
1149         return float128_default_nan(status);
1150     }
1152     if (lt128(a.high << 1, a.low, b.high << 1, b.low)) {
1153         aIsLargerSignificand = 0;
1154     } else if (lt128(b.high << 1, b.low, a.high << 1, a.low)) {
1155         aIsLargerSignificand = 1;
1156     } else {
1157         aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
1158     }
1160     if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
1161         if (is_snan(b_cls)) {
1162             return float128_silence_nan(b, status);
1163         }
1164         return b;
1165     } else {
1166         if (is_snan(a_cls)) {
1167             return float128_silence_nan(a, status);
1168         }
1169         return a;
1170     }