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===============================================================================
20This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
21Arithmetic Package, Release 2a.
22
23Written by John R. Hauser.  This work was made possible in part by the
24International Computer Science Institute, located at Suite 600, 1947 Center
25Street, Berkeley, California 94704.  Funding was partially provided by the
26National Science Foundation under grant MIP-9311980.  The original version
27of this code was written as part of a project to build a fixed-point vector
28processor in collaboration with the University of California at Berkeley,
29overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
30is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
31arithmetic/SoftFloat.html'.
32
33THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
34has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
35TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
36PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
37AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
38
39Derivative works are acceptable, even for commercial purposes, so long as
40(1) they include prominent notice that the work is derivative, and (2) they
41include prominent notice akin to these four paragraphs for those parts of
42this 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/*
83 * Define whether architecture deviates from IEEE in not supporting
84 * signaling NaNs (so all NaNs are treated as quiet).
85 */
86static inline bool no_signaling_nans(float_status *status)
87{
88#if defined(TARGET_XTENSA)
89    return status->no_signaling_nans;
90#else
91    return false;
92#endif
93}
94
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 */
102static inline bool snan_bit_is_one(float_status *status)
103{
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
111}
112
113/*----------------------------------------------------------------------------
114| For the deconstructed floating-point with fraction FRAC, return true
115| if the fraction represents a signalling NaN; otherwise false.
116*----------------------------------------------------------------------------*/
117
118static bool parts_is_snan_frac(uint64_t frac, float_status *status)
119{
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    }
126}
127
128/*----------------------------------------------------------------------------
129| The pattern for a default generated deconstructed floating-point NaN.
130*----------------------------------------------------------------------------*/
131
132static FloatParts parts_default_nan(float_status *status)
133{
134    bool sign = 0;
135    uint64_t frac;
136
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#elif defined(TARGET_HEXAGON)
149    sign = 1;
150    frac = ~0ULL;
151#else
152    /* This case is true for Alpha, ARM, MIPS, OpenRISC, PPC, RISC-V,
153     * S390, SH4, TriCore, and Xtensa.  I cannot find documentation
154     * for Unicore32; the choice from the original commit is unchanged.
155     * Our other supported targets, CRIS, LM32, Moxie, Nios2, and Tile,
156     * do not have floating-point.
157     */
158    if (snan_bit_is_one(status)) {
159        /* set all bits other than msb */
160        frac = (1ULL << (DECOMPOSED_BINARY_POINT - 1)) - 1;
161    } else {
162        /* set msb */
163        frac = 1ULL << (DECOMPOSED_BINARY_POINT - 1);
164    }
165#endif
166
167    return (FloatParts) {
168        .cls = float_class_qnan,
169        .sign = sign,
170        .exp = INT_MAX,
171        .frac = frac
172    };
173}
174
175/*----------------------------------------------------------------------------
176| Returns a quiet NaN from a signalling NaN for the deconstructed
177| floating-point parts.
178*----------------------------------------------------------------------------*/
179
180static FloatParts parts_silence_nan(FloatParts a, float_status *status)
181{
182    g_assert(!no_signaling_nans(status));
183#if defined(TARGET_HPPA)
184    a.frac &= ~(1ULL << (DECOMPOSED_BINARY_POINT - 1));
185    a.frac |= 1ULL << (DECOMPOSED_BINARY_POINT - 2);
186#else
187    if (snan_bit_is_one(status)) {
188        return parts_default_nan(status);
189    } else {
190        a.frac |= 1ULL << (DECOMPOSED_BINARY_POINT - 1);
191    }
192#endif
193    a.cls = float_class_qnan;
194    return a;
195}
196
197/*----------------------------------------------------------------------------
198| The pattern for a default generated extended double-precision NaN.
199*----------------------------------------------------------------------------*/
200floatx80 floatx80_default_nan(float_status *status)
201{
202    floatx80 r;
203
204    /* None of the targets that have snan_bit_is_one use floatx80.  */
205    assert(!snan_bit_is_one(status));
206#if defined(TARGET_M68K)
207    r.low = UINT64_C(0xFFFFFFFFFFFFFFFF);
208    r.high = 0x7FFF;
209#else
210    /* X86 */
211    r.low = UINT64_C(0xC000000000000000);
212    r.high = 0xFFFF;
213#endif
214    return r;
215}
216
217/*----------------------------------------------------------------------------
218| The pattern for a default generated extended double-precision inf.
219*----------------------------------------------------------------------------*/
220
221#define floatx80_infinity_high 0x7FFF
222#if defined(TARGET_M68K)
223#define floatx80_infinity_low  UINT64_C(0x0000000000000000)
224#else
225#define floatx80_infinity_low  UINT64_C(0x8000000000000000)
226#endif
227
228const floatx80 floatx80_infinity
229    = make_floatx80_init(floatx80_infinity_high, floatx80_infinity_low);
230
231/*----------------------------------------------------------------------------
232| Raises the exceptions specified by `flags'.  Floating-point traps can be
233| defined here if desired.  It is currently not possible for such a trap
234| to substitute a result value.  If traps are not implemented, this routine
235| should be simply `float_exception_flags |= flags;'.
236*----------------------------------------------------------------------------*/
237
238void float_raise(uint8_t flags, float_status *status)
239{
240    status->float_exception_flags |= flags;
241}
242
243/*----------------------------------------------------------------------------
244| Internal canonical NaN format.
245*----------------------------------------------------------------------------*/
246typedef struct {
247    bool sign;
248    uint64_t high, low;
249} commonNaNT;
250
251/*----------------------------------------------------------------------------
252| Returns 1 if the half-precision floating-point value `a' is a quiet
253| NaN; otherwise returns 0.
254*----------------------------------------------------------------------------*/
255
256bool float16_is_quiet_nan(float16 a_, float_status *status)
257{
258    if (no_signaling_nans(status)) {
259        return float16_is_any_nan(a_);
260    } else {
261        uint16_t a = float16_val(a_);
262        if (snan_bit_is_one(status)) {
263            return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
264        } else {
265
266            return ((a >> 9) & 0x3F) == 0x3F;
267        }
268    }
269}
270
271/*----------------------------------------------------------------------------
272| Returns 1 if the bfloat16 value `a' is a quiet
273| NaN; otherwise returns 0.
274*----------------------------------------------------------------------------*/
275
276bool bfloat16_is_quiet_nan(bfloat16 a_, float_status *status)
277{
278    if (no_signaling_nans(status)) {
279        return bfloat16_is_any_nan(a_);
280    } else {
281        uint16_t a = a_;
282        if (snan_bit_is_one(status)) {
283            return (((a >> 6) & 0x1FF) == 0x1FE) && (a & 0x3F);
284        } else {
285            return ((a >> 6) & 0x1FF) == 0x1FF;
286        }
287    }
288}
289
290/*----------------------------------------------------------------------------
291| Returns 1 if the half-precision floating-point value `a' is a signaling
292| NaN; otherwise returns 0.
293*----------------------------------------------------------------------------*/
294
295bool float16_is_signaling_nan(float16 a_, float_status *status)
296{
297    if (no_signaling_nans(status)) {
298        return 0;
299    } else {
300        uint16_t a = float16_val(a_);
301        if (snan_bit_is_one(status)) {
302            return ((a >> 9) & 0x3F) == 0x3F;
303        } else {
304            return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
305        }
306    }
307}
308
309/*----------------------------------------------------------------------------
310| Returns 1 if the bfloat16 value `a' is a signaling
311| NaN; otherwise returns 0.
312*----------------------------------------------------------------------------*/
313
314bool bfloat16_is_signaling_nan(bfloat16 a_, float_status *status)
315{
316    if (no_signaling_nans(status)) {
317        return 0;
318    } else {
319        uint16_t a = a_;
320        if (snan_bit_is_one(status)) {
321            return ((a >> 6) & 0x1FF) == 0x1FF;
322        } else {
323            return (((a >> 6) & 0x1FF) == 0x1FE) && (a & 0x3F);
324        }
325    }
326}
327
328/*----------------------------------------------------------------------------
329| Returns 1 if the single-precision floating-point value `a' is a quiet
330| NaN; otherwise returns 0.
331*----------------------------------------------------------------------------*/
332
333bool float32_is_quiet_nan(float32 a_, float_status *status)
334{
335    if (no_signaling_nans(status)) {
336        return float32_is_any_nan(a_);
337    } else {
338        uint32_t a = float32_val(a_);
339        if (snan_bit_is_one(status)) {
340            return (((a >> 22) & 0x1FF) == 0x1FE) && (a & 0x003FFFFF);
341        } else {
342            return ((uint32_t)(a << 1) >= 0xFF800000);
343        }
344    }
345}
346
347/*----------------------------------------------------------------------------
348| Returns 1 if the single-precision floating-point value `a' is a signaling
349| NaN; otherwise returns 0.
350*----------------------------------------------------------------------------*/
351
352bool float32_is_signaling_nan(float32 a_, float_status *status)
353{
354    if (no_signaling_nans(status)) {
355        return 0;
356    } else {
357        uint32_t a = float32_val(a_);
358        if (snan_bit_is_one(status)) {
359            return ((uint32_t)(a << 1) >= 0xFF800000);
360        } else {
361            return (((a >> 22) & 0x1FF) == 0x1FE) && (a & 0x003FFFFF);
362        }
363    }
364}
365
366/*----------------------------------------------------------------------------
367| Returns the result of converting the single-precision floating-point NaN
368| `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
369| exception is raised.
370*----------------------------------------------------------------------------*/
371
372static commonNaNT float32ToCommonNaN(float32 a, float_status *status)
373{
374    commonNaNT z;
375
376    if (float32_is_signaling_nan(a, status)) {
377        float_raise(float_flag_invalid, status);
378    }
379    z.sign = float32_val(a) >> 31;
380    z.low = 0;
381    z.high = ((uint64_t)float32_val(a)) << 41;
382    return z;
383}
384
385/*----------------------------------------------------------------------------
386| Returns the result of converting the canonical NaN `a' to the single-
387| precision floating-point format.
388*----------------------------------------------------------------------------*/
389
390static float32 commonNaNToFloat32(commonNaNT a, float_status *status)
391{
392    uint32_t mantissa = a.high >> 41;
393
394    if (status->default_nan_mode) {
395        return float32_default_nan(status);
396    }
397
398    if (mantissa) {
399        return make_float32(
400            (((uint32_t)a.sign) << 31) | 0x7F800000 | (a.high >> 41));
401    } else {
402        return float32_default_nan(status);
403    }
404}
405
406/*----------------------------------------------------------------------------
407| Select which NaN to propagate for a two-input operation.
408| IEEE754 doesn't specify all the details of this, so the
409| algorithm is target-specific.
410| The routine is passed various bits of information about the
411| two NaNs and should return 0 to select NaN a and 1 for NaN b.
412| Note that signalling NaNs are always squashed to quiet NaNs
413| by the caller, by calling floatXX_silence_nan() before
414| returning them.
415|
416| aIsLargerSignificand is only valid if both a and b are NaNs
417| of some kind, and is true if a has the larger significand,
418| or if both a and b have the same significand but a is
419| positive but b is negative. It is only needed for the x87
420| tie-break rule.
421*----------------------------------------------------------------------------*/
422
423static int pickNaN(FloatClass a_cls, FloatClass b_cls,
424                   bool aIsLargerSignificand, float_status *status)
425{
426#if defined(TARGET_ARM) || defined(TARGET_MIPS) || defined(TARGET_HPPA)
427    /* ARM mandated NaN propagation rules (see FPProcessNaNs()), take
428     * the first of:
429     *  1. A if it is signaling
430     *  2. B if it is signaling
431     *  3. A (quiet)
432     *  4. B (quiet)
433     * A signaling NaN is always quietened before returning it.
434     */
435    /* According to MIPS specifications, if one of the two operands is
436     * a sNaN, a new qNaN has to be generated. This is done in
437     * floatXX_silence_nan(). For qNaN inputs the specifications
438     * says: "When possible, this QNaN result is one of the operand QNaN
439     * values." In practice it seems that most implementations choose
440     * the first operand if both operands are qNaN. In short this gives
441     * the following rules:
442     *  1. A if it is signaling
443     *  2. B if it is signaling
444     *  3. A (quiet)
445     *  4. B (quiet)
446     * A signaling NaN is always silenced before returning it.
447     */
448    if (is_snan(a_cls)) {
449        return 0;
450    } else if (is_snan(b_cls)) {
451        return 1;
452    } else if (is_qnan(a_cls)) {
453        return 0;
454    } else {
455        return 1;
456    }
457#elif defined(TARGET_PPC) || defined(TARGET_M68K)
458    /* PowerPC propagation rules:
459     *  1. A if it sNaN or qNaN
460     *  2. B if it sNaN or qNaN
461     * A signaling NaN is always silenced before returning it.
462     */
463    /* M68000 FAMILY PROGRAMMER'S REFERENCE MANUAL
464     * 3.4 FLOATING-POINT INSTRUCTION DETAILS
465     * If either operand, but not both operands, of an operation is a
466     * nonsignaling NaN, then that NaN is returned as the result. If both
467     * operands are nonsignaling NaNs, then the destination operand
468     * nonsignaling NaN is returned as the result.
469     * If either operand to an operation is a signaling NaN (SNaN), then the
470     * SNaN bit is set in the FPSR EXC byte. If the SNaN exception enable bit
471     * is set in the FPCR ENABLE byte, then the exception is taken and the
472     * destination is not modified. If the SNaN exception enable bit is not
473     * set, setting the SNaN bit in the operand to a one converts the SNaN to
474     * a nonsignaling NaN. The operation then continues as described in the
475     * preceding paragraph for nonsignaling NaNs.
476     */
477    if (is_nan(a_cls)) {
478        return 0;
479    } else {
480        return 1;
481    }
482#elif defined(TARGET_XTENSA)
483    /*
484     * Xtensa has two NaN propagation modes.
485     * Which one is active is controlled by float_status::use_first_nan.
486     */
487    if (status->use_first_nan) {
488        if (is_nan(a_cls)) {
489            return 0;
490        } else {
491            return 1;
492        }
493    } else {
494        if (is_nan(b_cls)) {
495            return 1;
496        } else {
497            return 0;
498        }
499    }
500#else
501    /* This implements x87 NaN propagation rules:
502     * SNaN + QNaN => return the QNaN
503     * two SNaNs => return the one with the larger significand, silenced
504     * two QNaNs => return the one with the larger significand
505     * SNaN and a non-NaN => return the SNaN, silenced
506     * QNaN and a non-NaN => return the QNaN
507     *
508     * If we get down to comparing significands and they are the same,
509     * return the NaN with the positive sign bit (if any).
510     */
511    if (is_snan(a_cls)) {
512        if (is_snan(b_cls)) {
513            return aIsLargerSignificand ? 0 : 1;
514        }
515        return is_qnan(b_cls) ? 1 : 0;
516    } else if (is_qnan(a_cls)) {
517        if (is_snan(b_cls) || !is_qnan(b_cls)) {
518            return 0;
519        } else {
520            return aIsLargerSignificand ? 0 : 1;
521        }
522    } else {
523        return 1;
524    }
525#endif
526}
527
528/*----------------------------------------------------------------------------
529| Select which NaN to propagate for a three-input operation.
530| For the moment we assume that no CPU needs the 'larger significand'
531| information.
532| Return values : 0 : a; 1 : b; 2 : c; 3 : default-NaN
533*----------------------------------------------------------------------------*/
534static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
535                         bool infzero, float_status *status)
536{
537#if defined(TARGET_ARM)
538    /* For ARM, the (inf,zero,qnan) case sets InvalidOp and returns
539     * the default NaN
540     */
541    if (infzero && is_qnan(c_cls)) {
542        float_raise(float_flag_invalid, status);
543        return 3;
544    }
545
546    /* This looks different from the ARM ARM pseudocode, because the ARM ARM
547     * puts the operands to a fused mac operation (a*b)+c in the order c,a,b.
548     */
549    if (is_snan(c_cls)) {
550        return 2;
551    } else if (is_snan(a_cls)) {
552        return 0;
553    } else if (is_snan(b_cls)) {
554        return 1;
555    } else if (is_qnan(c_cls)) {
556        return 2;
557    } else if (is_qnan(a_cls)) {
558        return 0;
559    } else {
560        return 1;
561    }
562#elif defined(TARGET_MIPS)
563    if (snan_bit_is_one(status)) {
564        /*
565         * For MIPS systems that conform to IEEE754-1985, the (inf,zero,nan)
566         * case sets InvalidOp and returns the default NaN
567         */
568        if (infzero) {
569            float_raise(float_flag_invalid, status);
570            return 3;
571        }
572        /* Prefer sNaN over qNaN, in the a, b, c order. */
573        if (is_snan(a_cls)) {
574            return 0;
575        } else if (is_snan(b_cls)) {
576            return 1;
577        } else if (is_snan(c_cls)) {
578            return 2;
579        } else if (is_qnan(a_cls)) {
580            return 0;
581        } else if (is_qnan(b_cls)) {
582            return 1;
583        } else {
584            return 2;
585        }
586    } else {
587        /*
588         * For MIPS systems that conform to IEEE754-2008, the (inf,zero,nan)
589         * case sets InvalidOp and returns the input value 'c'
590         */
591        if (infzero) {
592            float_raise(float_flag_invalid, status);
593            return 2;
594        }
595        /* Prefer sNaN over qNaN, in the c, a, b order. */
596        if (is_snan(c_cls)) {
597            return 2;
598        } else if (is_snan(a_cls)) {
599            return 0;
600        } else if (is_snan(b_cls)) {
601            return 1;
602        } else if (is_qnan(c_cls)) {
603            return 2;
604        } else if (is_qnan(a_cls)) {
605            return 0;
606        } else {
607            return 1;
608        }
609    }
610#elif defined(TARGET_PPC)
611    /* For PPC, the (inf,zero,qnan) case sets InvalidOp, but we prefer
612     * to return an input NaN if we have one (ie c) rather than generating
613     * a default NaN
614     */
615    if (infzero) {
616        float_raise(float_flag_invalid, status);
617        return 2;
618    }
619
620    /* If fRA is a NaN return it; otherwise if fRB is a NaN return it;
621     * otherwise return fRC. Note that muladd on PPC is (fRA * fRC) + frB
622     */
623    if (is_nan(a_cls)) {
624        return 0;
625    } else if (is_nan(c_cls)) {
626        return 2;
627    } else {
628        return 1;
629    }
630#elif defined(TARGET_XTENSA)
631    /*
632     * For Xtensa, the (inf,zero,nan) case sets InvalidOp and returns
633     * an input NaN if we have one (ie c).
634     */
635    if (infzero) {
636        float_raise(float_flag_invalid, status);
637        return 2;
638    }
639    if (status->use_first_nan) {
640        if (is_nan(a_cls)) {
641            return 0;
642        } else if (is_nan(b_cls)) {
643            return 1;
644        } else {
645            return 2;
646        }
647    } else {
648        if (is_nan(c_cls)) {
649            return 2;
650        } else if (is_nan(b_cls)) {
651            return 1;
652        } else {
653            return 0;
654        }
655    }
656#else
657    /* A default implementation: prefer a to b to c.
658     * This is unlikely to actually match any real implementation.
659     */
660    if (is_nan(a_cls)) {
661        return 0;
662    } else if (is_nan(b_cls)) {
663        return 1;
664    } else {
665        return 2;
666    }
667#endif
668}
669
670/*----------------------------------------------------------------------------
671| Takes two single-precision floating-point values `a' and `b', one of which
672| is a NaN, and returns the appropriate NaN result.  If either `a' or `b' is a
673| signaling NaN, the invalid exception is raised.
674*----------------------------------------------------------------------------*/
675
676static float32 propagateFloat32NaN(float32 a, float32 b, float_status *status)
677{
678    bool aIsLargerSignificand;
679    uint32_t av, bv;
680    FloatClass a_cls, b_cls;
681
682    /* This is not complete, but is good enough for pickNaN.  */
683    a_cls = (!float32_is_any_nan(a)
684             ? float_class_normal
685             : float32_is_signaling_nan(a, status)
686             ? float_class_snan
687             : float_class_qnan);
688    b_cls = (!float32_is_any_nan(b)
689             ? float_class_normal
690             : float32_is_signaling_nan(b, status)
691             ? float_class_snan
692             : float_class_qnan);
693
694    av = float32_val(a);
695    bv = float32_val(b);
696
697    if (is_snan(a_cls) || is_snan(b_cls)) {
698        float_raise(float_flag_invalid, status);
699    }
700
701    if (status->default_nan_mode) {
702        return float32_default_nan(status);
703    }
704
705    if ((uint32_t)(av << 1) < (uint32_t)(bv << 1)) {
706        aIsLargerSignificand = 0;
707    } else if ((uint32_t)(bv << 1) < (uint32_t)(av << 1)) {
708        aIsLargerSignificand = 1;
709    } else {
710        aIsLargerSignificand = (av < bv) ? 1 : 0;
711    }
712
713    if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
714        if (is_snan(b_cls)) {
715            return float32_silence_nan(b, status);
716        }
717        return b;
718    } else {
719        if (is_snan(a_cls)) {
720            return float32_silence_nan(a, status);
721        }
722        return a;
723    }
724}
725
726/*----------------------------------------------------------------------------
727| Returns 1 if the double-precision floating-point value `a' is a quiet
728| NaN; otherwise returns 0.
729*----------------------------------------------------------------------------*/
730
731bool float64_is_quiet_nan(float64 a_, float_status *status)
732{
733    if (no_signaling_nans(status)) {
734        return float64_is_any_nan(a_);
735    } else {
736        uint64_t a = float64_val(a_);
737        if (snan_bit_is_one(status)) {
738            return (((a >> 51) & 0xFFF) == 0xFFE)
739                && (a & 0x0007FFFFFFFFFFFFULL);
740        } else {
741            return ((a << 1) >= 0xFFF0000000000000ULL);
742        }
743    }
744}
745
746/*----------------------------------------------------------------------------
747| Returns 1 if the double-precision floating-point value `a' is a signaling
748| NaN; otherwise returns 0.
749*----------------------------------------------------------------------------*/
750
751bool float64_is_signaling_nan(float64 a_, float_status *status)
752{
753    if (no_signaling_nans(status)) {
754        return 0;
755    } else {
756        uint64_t a = float64_val(a_);
757        if (snan_bit_is_one(status)) {
758            return ((a << 1) >= 0xFFF0000000000000ULL);
759        } else {
760            return (((a >> 51) & 0xFFF) == 0xFFE)
761                && (a & UINT64_C(0x0007FFFFFFFFFFFF));
762        }
763    }
764}
765
766/*----------------------------------------------------------------------------
767| Returns the result of converting the double-precision floating-point NaN
768| `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
769| exception is raised.
770*----------------------------------------------------------------------------*/
771
772static commonNaNT float64ToCommonNaN(float64 a, float_status *status)
773{
774    commonNaNT z;
775
776    if (float64_is_signaling_nan(a, status)) {
777        float_raise(float_flag_invalid, status);
778    }
779    z.sign = float64_val(a) >> 63;
780    z.low = 0;
781    z.high = float64_val(a) << 12;
782    return z;
783}
784
785/*----------------------------------------------------------------------------
786| Returns the result of converting the canonical NaN `a' to the double-
787| precision floating-point format.
788*----------------------------------------------------------------------------*/
789
790static float64 commonNaNToFloat64(commonNaNT a, float_status *status)
791{
792    uint64_t mantissa = a.high >> 12;
793
794    if (status->default_nan_mode) {
795        return float64_default_nan(status);
796    }
797
798    if (mantissa) {
799        return make_float64(
800              (((uint64_t) a.sign) << 63)
801            | UINT64_C(0x7FF0000000000000)
802            | (a.high >> 12));
803    } else {
804        return float64_default_nan(status);
805    }
806}
807
808/*----------------------------------------------------------------------------
809| Takes two double-precision floating-point values `a' and `b', one of which
810| is a NaN, and returns the appropriate NaN result.  If either `a' or `b' is a
811| signaling NaN, the invalid exception is raised.
812*----------------------------------------------------------------------------*/
813
814static float64 propagateFloat64NaN(float64 a, float64 b, float_status *status)
815{
816    bool aIsLargerSignificand;
817    uint64_t av, bv;
818    FloatClass a_cls, b_cls;
819
820    /* This is not complete, but is good enough for pickNaN.  */
821    a_cls = (!float64_is_any_nan(a)
822             ? float_class_normal
823             : float64_is_signaling_nan(a, status)
824             ? float_class_snan
825             : float_class_qnan);
826    b_cls = (!float64_is_any_nan(b)
827             ? float_class_normal
828             : float64_is_signaling_nan(b, status)
829             ? float_class_snan
830             : float_class_qnan);
831
832    av = float64_val(a);
833    bv = float64_val(b);
834
835    if (is_snan(a_cls) || is_snan(b_cls)) {
836        float_raise(float_flag_invalid, status);
837    }
838
839    if (status->default_nan_mode) {
840        return float64_default_nan(status);
841    }
842
843    if ((uint64_t)(av << 1) < (uint64_t)(bv << 1)) {
844        aIsLargerSignificand = 0;
845    } else if ((uint64_t)(bv << 1) < (uint64_t)(av << 1)) {
846        aIsLargerSignificand = 1;
847    } else {
848        aIsLargerSignificand = (av < bv) ? 1 : 0;
849    }
850
851    if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
852        if (is_snan(b_cls)) {
853            return float64_silence_nan(b, status);
854        }
855        return b;
856    } else {
857        if (is_snan(a_cls)) {
858            return float64_silence_nan(a, status);
859        }
860        return a;
861    }
862}
863
864/*----------------------------------------------------------------------------
865| Returns 1 if the extended double-precision floating-point value `a' is a
866| quiet NaN; otherwise returns 0. This slightly differs from the same
867| function for other types as floatx80 has an explicit bit.
868*----------------------------------------------------------------------------*/
869
870int floatx80_is_quiet_nan(floatx80 a, float_status *status)
871{
872    if (no_signaling_nans(status)) {
873        return floatx80_is_any_nan(a);
874    } else {
875        if (snan_bit_is_one(status)) {
876            uint64_t aLow;
877
878            aLow = a.low & ~0x4000000000000000ULL;
879            return ((a.high & 0x7FFF) == 0x7FFF)
880                && (aLow << 1)
881                && (a.low == aLow);
882        } else {
883            return ((a.high & 0x7FFF) == 0x7FFF)
884                && (UINT64_C(0x8000000000000000) <= ((uint64_t)(a.low << 1)));
885        }
886    }
887}
888
889/*----------------------------------------------------------------------------
890| Returns 1 if the extended double-precision floating-point value `a' is a
891| signaling NaN; otherwise returns 0. This slightly differs from the same
892| function for other types as floatx80 has an explicit bit.
893*----------------------------------------------------------------------------*/
894
895int floatx80_is_signaling_nan(floatx80 a, float_status *status)
896{
897    if (no_signaling_nans(status)) {
898        return 0;
899    } else {
900        if (snan_bit_is_one(status)) {
901            return ((a.high & 0x7FFF) == 0x7FFF)
902                && ((a.low << 1) >= 0x8000000000000000ULL);
903        } else {
904            uint64_t aLow;
905
906            aLow = a.low & ~UINT64_C(0x4000000000000000);
907            return ((a.high & 0x7FFF) == 0x7FFF)
908                && (uint64_t)(aLow << 1)
909                && (a.low == aLow);
910        }
911    }
912}
913
914/*----------------------------------------------------------------------------
915| Returns a quiet NaN from a signalling NaN for the extended double-precision
916| floating point value `a'.
917*----------------------------------------------------------------------------*/
918
919floatx80 floatx80_silence_nan(floatx80 a, float_status *status)
920{
921    /* None of the targets that have snan_bit_is_one use floatx80.  */
922    assert(!snan_bit_is_one(status));
923    a.low |= UINT64_C(0xC000000000000000);
924    return a;
925}
926
927/*----------------------------------------------------------------------------
928| Returns the result of converting the extended double-precision floating-
929| point NaN `a' to the canonical NaN format.  If `a' is a signaling NaN, the
930| invalid exception is raised.
931*----------------------------------------------------------------------------*/
932
933static commonNaNT floatx80ToCommonNaN(floatx80 a, float_status *status)
934{
935    floatx80 dflt;
936    commonNaNT z;
937
938    if (floatx80_is_signaling_nan(a, status)) {
939        float_raise(float_flag_invalid, status);
940    }
941    if (a.low >> 63) {
942        z.sign = a.high >> 15;
943        z.low = 0;
944        z.high = a.low << 1;
945    } else {
946        dflt = floatx80_default_nan(status);
947        z.sign = dflt.high >> 15;
948        z.low = 0;
949        z.high = dflt.low << 1;
950    }
951    return z;
952}
953
954/*----------------------------------------------------------------------------
955| Returns the result of converting the canonical NaN `a' to the extended
956| double-precision floating-point format.
957*----------------------------------------------------------------------------*/
958
959static floatx80 commonNaNToFloatx80(commonNaNT a, float_status *status)
960{
961    floatx80 z;
962
963    if (status->default_nan_mode) {
964        return floatx80_default_nan(status);
965    }
966
967    if (a.high >> 1) {
968        z.low = UINT64_C(0x8000000000000000) | a.high >> 1;
969        z.high = (((uint16_t)a.sign) << 15) | 0x7FFF;
970    } else {
971        z = floatx80_default_nan(status);
972    }
973    return z;
974}
975
976/*----------------------------------------------------------------------------
977| Takes two extended double-precision floating-point values `a' and `b', one
978| of which is a NaN, and returns the appropriate NaN result.  If either `a' or
979| `b' is a signaling NaN, the invalid exception is raised.
980*----------------------------------------------------------------------------*/
981
982floatx80 propagateFloatx80NaN(floatx80 a, floatx80 b, float_status *status)
983{
984    bool aIsLargerSignificand;
985    FloatClass a_cls, b_cls;
986
987    /* This is not complete, but is good enough for pickNaN.  */
988    a_cls = (!floatx80_is_any_nan(a)
989             ? float_class_normal
990             : floatx80_is_signaling_nan(a, status)
991             ? float_class_snan
992             : float_class_qnan);
993    b_cls = (!floatx80_is_any_nan(b)
994             ? float_class_normal
995             : floatx80_is_signaling_nan(b, status)
996             ? float_class_snan
997             : float_class_qnan);
998
999    if (is_snan(a_cls) || is_snan(b_cls)) {
1000        float_raise(float_flag_invalid, status);
1001    }
1002
1003    if (status->default_nan_mode) {
1004        return floatx80_default_nan(status);
1005    }
1006
1007    if (a.low < b.low) {
1008        aIsLargerSignificand = 0;
1009    } else if (b.low < a.low) {
1010        aIsLargerSignificand = 1;
1011    } else {
1012        aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
1013    }
1014
1015    if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
1016        if (is_snan(b_cls)) {
1017            return floatx80_silence_nan(b, status);
1018        }
1019        return b;
1020    } else {
1021        if (is_snan(a_cls)) {
1022            return floatx80_silence_nan(a, status);
1023        }
1024        return a;
1025    }
1026}
1027
1028/*----------------------------------------------------------------------------
1029| Returns 1 if the quadruple-precision floating-point value `a' is a quiet
1030| NaN; otherwise returns 0.
1031*----------------------------------------------------------------------------*/
1032
1033bool float128_is_quiet_nan(float128 a, float_status *status)
1034{
1035    if (no_signaling_nans(status)) {
1036        return float128_is_any_nan(a);
1037    } else {
1038        if (snan_bit_is_one(status)) {
1039            return (((a.high >> 47) & 0xFFFF) == 0xFFFE)
1040                && (a.low || (a.high & 0x00007FFFFFFFFFFFULL));
1041        } else {
1042            return ((a.high << 1) >= 0xFFFF000000000000ULL)
1043                && (a.low || (a.high & 0x0000FFFFFFFFFFFFULL));
1044        }
1045    }
1046}
1047
1048/*----------------------------------------------------------------------------
1049| Returns 1 if the quadruple-precision floating-point value `a' is a
1050| signaling NaN; otherwise returns 0.
1051*----------------------------------------------------------------------------*/
1052
1053bool float128_is_signaling_nan(float128 a, float_status *status)
1054{
1055    if (no_signaling_nans(status)) {
1056        return 0;
1057    } else {
1058        if (snan_bit_is_one(status)) {
1059            return ((a.high << 1) >= 0xFFFF000000000000ULL)
1060                && (a.low || (a.high & 0x0000FFFFFFFFFFFFULL));
1061        } else {
1062            return (((a.high >> 47) & 0xFFFF) == 0xFFFE)
1063                && (a.low || (a.high & UINT64_C(0x00007FFFFFFFFFFF)));
1064        }
1065    }
1066}
1067
1068/*----------------------------------------------------------------------------
1069| Returns a quiet NaN from a signalling NaN for the quadruple-precision
1070| floating point value `a'.
1071*----------------------------------------------------------------------------*/
1072
1073float128 float128_silence_nan(float128 a, float_status *status)
1074{
1075    if (no_signaling_nans(status)) {
1076        g_assert_not_reached();
1077    } else {
1078        if (snan_bit_is_one(status)) {
1079            return float128_default_nan(status);
1080        } else {
1081            a.high |= UINT64_C(0x0000800000000000);
1082            return a;
1083        }
1084    }
1085}
1086
1087/*----------------------------------------------------------------------------
1088| Returns the result of converting the quadruple-precision floating-point NaN
1089| `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
1090| exception is raised.
1091*----------------------------------------------------------------------------*/
1092
1093static commonNaNT float128ToCommonNaN(float128 a, float_status *status)
1094{
1095    commonNaNT z;
1096
1097    if (float128_is_signaling_nan(a, status)) {
1098        float_raise(float_flag_invalid, status);
1099    }
1100    z.sign = a.high >> 63;
1101    shortShift128Left(a.high, a.low, 16, &z.high, &z.low);
1102    return z;
1103}
1104
1105/*----------------------------------------------------------------------------
1106| Returns the result of converting the canonical NaN `a' to the quadruple-
1107| precision floating-point format.
1108*----------------------------------------------------------------------------*/
1109
1110static float128 commonNaNToFloat128(commonNaNT a, float_status *status)
1111{
1112    float128 z;
1113
1114    if (status->default_nan_mode) {
1115        return float128_default_nan(status);
1116    }
1117
1118    shift128Right(a.high, a.low, 16, &z.high, &z.low);
1119    z.high |= (((uint64_t)a.sign) << 63) | UINT64_C(0x7FFF000000000000);
1120    return z;
1121}
1122
1123/*----------------------------------------------------------------------------
1124| Takes two quadruple-precision floating-point values `a' and `b', one of
1125| which is a NaN, and returns the appropriate NaN result.  If either `a' or
1126| `b' is a signaling NaN, the invalid exception is raised.
1127*----------------------------------------------------------------------------*/
1128
1129static float128 propagateFloat128NaN(float128 a, float128 b,
1130                                     float_status *status)
1131{
1132    bool aIsLargerSignificand;
1133    FloatClass a_cls, b_cls;
1134
1135    /* This is not complete, but is good enough for pickNaN.  */
1136    a_cls = (!float128_is_any_nan(a)
1137             ? float_class_normal
1138             : float128_is_signaling_nan(a, status)
1139             ? float_class_snan
1140             : float_class_qnan);
1141    b_cls = (!float128_is_any_nan(b)
1142             ? float_class_normal
1143             : float128_is_signaling_nan(b, status)
1144             ? float_class_snan
1145             : float_class_qnan);
1146
1147    if (is_snan(a_cls) || is_snan(b_cls)) {
1148        float_raise(float_flag_invalid, status);
1149    }
1150
1151    if (status->default_nan_mode) {
1152        return float128_default_nan(status);
1153    }
1154
1155    if (lt128(a.high << 1, a.low, b.high << 1, b.low)) {
1156        aIsLargerSignificand = 0;
1157    } else if (lt128(b.high << 1, b.low, a.high << 1, a.low)) {
1158        aIsLargerSignificand = 1;
1159    } else {
1160        aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
1161    }
1162
1163    if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
1164        if (is_snan(b_cls)) {
1165            return float128_silence_nan(b, status);
1166        }
1167        return b;
1168    } else {
1169        if (is_snan(a_cls)) {
1170            return float128_silence_nan(a, status);
1171        }
1172        return a;
1173    }
1174}
1175