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
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.
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 ===============================================================================
48 * Copyright (c) 2006, Fabrice Bellard
49 * All rights reserved.
51 * Redistribution and use in source and binary forms, with or without
52 * modification, are permitted provided that the following conditions are met:
54 * 1. Redistributions of source code must retain the above copyright notice,
55 * this list of conditions and the following disclaimer.
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.
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.
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.
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.
82 /* Does the target distinguish signaling NaNs from non-signaling NaNs
83 * by setting the most significant bit of the mantissa for a signaling NaN?
84 * (The more common choice is to have it be zero for SNaN and one for QNaN.)
86 #if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
87 #define SNAN_BIT_IS_ONE 1
89 #define SNAN_BIT_IS_ONE 0
92 #if defined(TARGET_XTENSA)
93 /* Define for architectures which deviate from IEEE in not supporting
94 * signaling NaNs (so all NaNs are treated as quiet).
96 #define NO_SIGNALING_NANS 1
99 /*----------------------------------------------------------------------------
100 | The pattern for a default generated half-precision NaN.
101 *----------------------------------------------------------------------------*/
102 #if defined(TARGET_ARM)
103 const float16 float16_default_nan
= const_float16(0x7E00);
104 #elif SNAN_BIT_IS_ONE
105 const float16 float16_default_nan
= const_float16(0x7DFF);
107 const float16 float16_default_nan
= const_float16(0xFE00);
110 /*----------------------------------------------------------------------------
111 | The pattern for a default generated single-precision NaN.
112 *----------------------------------------------------------------------------*/
113 #if defined(TARGET_SPARC)
114 const float32 float32_default_nan
= const_float32(0x7FFFFFFF);
115 #elif defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_ALPHA) || \
116 defined(TARGET_XTENSA) || defined(TARGET_S390X)
117 const float32 float32_default_nan
= const_float32(0x7FC00000);
118 #elif SNAN_BIT_IS_ONE
119 const float32 float32_default_nan
= const_float32(0x7FBFFFFF);
121 const float32 float32_default_nan
= const_float32(0xFFC00000);
124 /*----------------------------------------------------------------------------
125 | The pattern for a default generated double-precision NaN.
126 *----------------------------------------------------------------------------*/
127 #if defined(TARGET_SPARC)
128 const float64 float64_default_nan
= const_float64(LIT64( 0x7FFFFFFFFFFFFFFF ));
129 #elif defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_ALPHA) || \
130 defined(TARGET_S390X)
131 const float64 float64_default_nan
= const_float64(LIT64( 0x7FF8000000000000 ));
132 #elif SNAN_BIT_IS_ONE
133 const float64 float64_default_nan
= const_float64(LIT64(0x7FF7FFFFFFFFFFFF));
135 const float64 float64_default_nan
= const_float64(LIT64( 0xFFF8000000000000 ));
138 /*----------------------------------------------------------------------------
139 | The pattern for a default generated extended double-precision NaN.
140 *----------------------------------------------------------------------------*/
142 #define floatx80_default_nan_high 0x7FFF
143 #define floatx80_default_nan_low LIT64(0xBFFFFFFFFFFFFFFF)
145 #define floatx80_default_nan_high 0xFFFF
146 #define floatx80_default_nan_low LIT64( 0xC000000000000000 )
149 const floatx80 floatx80_default_nan
150 = make_floatx80_init(floatx80_default_nan_high
, floatx80_default_nan_low
);
152 /*----------------------------------------------------------------------------
153 | The pattern for a default generated quadruple-precision NaN. The `high' and
154 | `low' values hold the most- and least-significant bits, respectively.
155 *----------------------------------------------------------------------------*/
157 #define float128_default_nan_high LIT64(0x7FFF7FFFFFFFFFFF)
158 #define float128_default_nan_low LIT64(0xFFFFFFFFFFFFFFFF)
159 #elif defined(TARGET_S390X)
160 #define float128_default_nan_high LIT64( 0x7FFF800000000000 )
161 #define float128_default_nan_low LIT64( 0x0000000000000000 )
163 #define float128_default_nan_high LIT64( 0xFFFF800000000000 )
164 #define float128_default_nan_low LIT64( 0x0000000000000000 )
167 const float128 float128_default_nan
168 = make_float128_init(float128_default_nan_high
, float128_default_nan_low
);
170 /*----------------------------------------------------------------------------
171 | Raises the exceptions specified by `flags'. Floating-point traps can be
172 | defined here if desired. It is currently not possible for such a trap
173 | to substitute a result value. If traps are not implemented, this routine
174 | should be simply `float_exception_flags |= flags;'.
175 *----------------------------------------------------------------------------*/
177 void float_raise(int8_t flags
, float_status
*status
)
179 status
->float_exception_flags
|= flags
;
182 /*----------------------------------------------------------------------------
183 | Internal canonical NaN format.
184 *----------------------------------------------------------------------------*/
190 #ifdef NO_SIGNALING_NANS
191 int float16_is_quiet_nan(float16 a_
)
193 return float16_is_any_nan(a_
);
196 int float16_is_signaling_nan(float16 a_
)
201 /*----------------------------------------------------------------------------
202 | Returns 1 if the half-precision floating-point value `a' is a quiet
203 | NaN; otherwise returns 0.
204 *----------------------------------------------------------------------------*/
206 int float16_is_quiet_nan(float16 a_
)
208 uint16_t a
= float16_val(a_
);
210 return (((a
>> 9) & 0x3F) == 0x3E) && (a
& 0x1FF);
212 return ((a
& ~0x8000) >= 0x7c80);
216 /*----------------------------------------------------------------------------
217 | Returns 1 if the half-precision floating-point value `a' is a signaling
218 | NaN; otherwise returns 0.
219 *----------------------------------------------------------------------------*/
221 int float16_is_signaling_nan(float16 a_
)
223 uint16_t a
= float16_val(a_
);
225 return ((a
& ~0x8000) >= 0x7c80);
227 return (((a
>> 9) & 0x3F) == 0x3E) && (a
& 0x1FF);
232 /*----------------------------------------------------------------------------
233 | Returns a quiet NaN if the half-precision floating point value `a' is a
234 | signaling NaN; otherwise returns `a'.
235 *----------------------------------------------------------------------------*/
236 float16
float16_maybe_silence_nan(float16 a_
)
238 if (float16_is_signaling_nan(a_
)) {
240 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
241 return float16_default_nan
;
243 # error Rules for silencing a signaling NaN are target-specific
246 uint16_t a
= float16_val(a_
);
248 return make_float16(a
);
254 /*----------------------------------------------------------------------------
255 | Returns the result of converting the half-precision floating-point NaN
256 | `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
257 | exception is raised.
258 *----------------------------------------------------------------------------*/
260 static commonNaNT
float16ToCommonNaN(float16 a
, float_status
*status
)
264 if (float16_is_signaling_nan(a
)) {
265 float_raise(float_flag_invalid
, status
);
267 z
.sign
= float16_val(a
) >> 15;
269 z
.high
= ((uint64_t) float16_val(a
))<<54;
273 /*----------------------------------------------------------------------------
274 | Returns the result of converting the canonical NaN `a' to the half-
275 | precision floating-point format.
276 *----------------------------------------------------------------------------*/
278 static float16
commonNaNToFloat16(commonNaNT a
, float_status
*status
)
280 uint16_t mantissa
= a
.high
>>54;
282 if (status
->default_nan_mode
) {
283 return float16_default_nan
;
287 return make_float16(((((uint16_t) a
.sign
) << 15)
288 | (0x1F << 10) | mantissa
));
290 return float16_default_nan
;
294 #ifdef NO_SIGNALING_NANS
295 int float32_is_quiet_nan(float32 a_
)
297 return float32_is_any_nan(a_
);
300 int float32_is_signaling_nan(float32 a_
)
305 /*----------------------------------------------------------------------------
306 | Returns 1 if the single-precision floating-point value `a' is a quiet
307 | NaN; otherwise returns 0.
308 *----------------------------------------------------------------------------*/
310 int float32_is_quiet_nan( float32 a_
)
312 uint32_t a
= float32_val(a_
);
314 return (((a
>> 22) & 0x1ff) == 0x1fe) && (a
& 0x003fffff);
316 return ((uint32_t)(a
<< 1) >= 0xff800000);
320 /*----------------------------------------------------------------------------
321 | Returns 1 if the single-precision floating-point value `a' is a signaling
322 | NaN; otherwise returns 0.
323 *----------------------------------------------------------------------------*/
325 int float32_is_signaling_nan( float32 a_
)
327 uint32_t a
= float32_val(a_
);
329 return ((uint32_t)(a
<< 1) >= 0xff800000);
331 return ( ( ( a
>>22 ) & 0x1FF ) == 0x1FE ) && ( a
& 0x003FFFFF );
336 /*----------------------------------------------------------------------------
337 | Returns a quiet NaN if the single-precision floating point value `a' is a
338 | signaling NaN; otherwise returns `a'.
339 *----------------------------------------------------------------------------*/
341 float32
float32_maybe_silence_nan( float32 a_
)
343 if (float32_is_signaling_nan(a_
)) {
345 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
346 return float32_default_nan
;
348 # error Rules for silencing a signaling NaN are target-specific
351 uint32_t a
= float32_val(a_
);
353 return make_float32(a
);
359 /*----------------------------------------------------------------------------
360 | Returns the result of converting the single-precision floating-point NaN
361 | `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
362 | exception is raised.
363 *----------------------------------------------------------------------------*/
365 static commonNaNT
float32ToCommonNaN(float32 a
, float_status
*status
)
369 if (float32_is_signaling_nan(a
)) {
370 float_raise(float_flag_invalid
, status
);
372 z
.sign
= float32_val(a
)>>31;
374 z
.high
= ( (uint64_t) float32_val(a
) )<<41;
378 /*----------------------------------------------------------------------------
379 | Returns the result of converting the canonical NaN `a' to the single-
380 | precision floating-point format.
381 *----------------------------------------------------------------------------*/
383 static float32
commonNaNToFloat32(commonNaNT a
, float_status
*status
)
385 uint32_t mantissa
= a
.high
>>41;
387 if (status
->default_nan_mode
) {
388 return float32_default_nan
;
393 ( ( (uint32_t) a
.sign
)<<31 ) | 0x7F800000 | ( a
.high
>>41 ) );
395 return float32_default_nan
;
398 /*----------------------------------------------------------------------------
399 | Select which NaN to propagate for a two-input operation.
400 | IEEE754 doesn't specify all the details of this, so the
401 | algorithm is target-specific.
402 | The routine is passed various bits of information about the
403 | two NaNs and should return 0 to select NaN a and 1 for NaN b.
404 | Note that signalling NaNs are always squashed to quiet NaNs
405 | by the caller, by calling floatXX_maybe_silence_nan() before
408 | aIsLargerSignificand is only valid if both a and b are NaNs
409 | of some kind, and is true if a has the larger significand,
410 | or if both a and b have the same significand but a is
411 | positive but b is negative. It is only needed for the x87
413 *----------------------------------------------------------------------------*/
415 #if defined(TARGET_ARM)
416 static int pickNaN(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
417 flag aIsLargerSignificand
)
419 /* ARM mandated NaN propagation rules: take the first of:
420 * 1. A if it is signaling
421 * 2. B if it is signaling
424 * A signaling NaN is always quietened before returning it.
428 } else if (bIsSNaN
) {
430 } else if (aIsQNaN
) {
436 #elif defined(TARGET_MIPS)
437 static int pickNaN(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
438 flag aIsLargerSignificand
)
440 /* According to MIPS specifications, if one of the two operands is
441 * a sNaN, a new qNaN has to be generated. This is done in
442 * floatXX_maybe_silence_nan(). For qNaN inputs the specifications
443 * says: "When possible, this QNaN result is one of the operand QNaN
444 * values." In practice it seems that most implementations choose
445 * the first operand if both operands are qNaN. In short this gives
446 * the following rules:
447 * 1. A if it is signaling
448 * 2. B if it is signaling
451 * A signaling NaN is always silenced before returning it.
455 } else if (bIsSNaN
) {
457 } else if (aIsQNaN
) {
463 #elif defined(TARGET_PPC) || defined(TARGET_XTENSA)
464 static int pickNaN(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
465 flag aIsLargerSignificand
)
467 /* PowerPC propagation rules:
468 * 1. A if it sNaN or qNaN
469 * 2. B if it sNaN or qNaN
470 * A signaling NaN is always silenced before returning it.
472 if (aIsSNaN
|| aIsQNaN
) {
479 static int pickNaN(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
480 flag aIsLargerSignificand
)
482 /* This implements x87 NaN propagation rules:
483 * SNaN + QNaN => return the QNaN
484 * two SNaNs => return the one with the larger significand, silenced
485 * two QNaNs => return the one with the larger significand
486 * SNaN and a non-NaN => return the SNaN, silenced
487 * QNaN and a non-NaN => return the QNaN
489 * If we get down to comparing significands and they are the same,
490 * return the NaN with the positive sign bit (if any).
494 return aIsLargerSignificand
? 0 : 1;
496 return bIsQNaN
? 1 : 0;
499 if (bIsSNaN
|| !bIsQNaN
)
502 return aIsLargerSignificand
? 0 : 1;
510 /*----------------------------------------------------------------------------
511 | Select which NaN to propagate for a three-input operation.
512 | For the moment we assume that no CPU needs the 'larger significand'
514 | Return values : 0 : a; 1 : b; 2 : c; 3 : default-NaN
515 *----------------------------------------------------------------------------*/
516 #if defined(TARGET_ARM)
517 static int pickNaNMulAdd(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
518 flag cIsQNaN
, flag cIsSNaN
, flag infzero
,
519 float_status
*status
)
521 /* For ARM, the (inf,zero,qnan) case sets InvalidOp and returns
524 if (infzero
&& cIsQNaN
) {
525 float_raise(float_flag_invalid
, status
);
529 /* This looks different from the ARM ARM pseudocode, because the ARM ARM
530 * puts the operands to a fused mac operation (a*b)+c in the order c,a,b.
534 } else if (aIsSNaN
) {
536 } else if (bIsSNaN
) {
538 } else if (cIsQNaN
) {
540 } else if (aIsQNaN
) {
546 #elif defined(TARGET_MIPS)
547 static int pickNaNMulAdd(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
548 flag cIsQNaN
, flag cIsSNaN
, flag infzero
,
549 float_status
*status
)
551 /* For MIPS, the (inf,zero,qnan) case sets InvalidOp and returns
555 float_raise(float_flag_invalid
, status
);
559 /* Prefer sNaN over qNaN, in the a, b, c order. */
562 } else if (bIsSNaN
) {
564 } else if (cIsSNaN
) {
566 } else if (aIsQNaN
) {
568 } else if (bIsQNaN
) {
574 #elif defined(TARGET_PPC)
575 static int pickNaNMulAdd(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
576 flag cIsQNaN
, flag cIsSNaN
, flag infzero
,
577 float_status
*status
)
579 /* For PPC, the (inf,zero,qnan) case sets InvalidOp, but we prefer
580 * to return an input NaN if we have one (ie c) rather than generating
584 float_raise(float_flag_invalid
, status
);
588 /* If fRA is a NaN return it; otherwise if fRB is a NaN return it;
589 * otherwise return fRC. Note that muladd on PPC is (fRA * fRC) + frB
591 if (aIsSNaN
|| aIsQNaN
) {
593 } else if (cIsSNaN
|| cIsQNaN
) {
600 /* A default implementation: prefer a to b to c.
601 * This is unlikely to actually match any real implementation.
603 static int pickNaNMulAdd(flag aIsQNaN
, flag aIsSNaN
, flag bIsQNaN
, flag bIsSNaN
,
604 flag cIsQNaN
, flag cIsSNaN
, flag infzero
,
605 float_status
*status
)
607 if (aIsSNaN
|| aIsQNaN
) {
609 } else if (bIsSNaN
|| bIsQNaN
) {
617 /*----------------------------------------------------------------------------
618 | Takes two single-precision floating-point values `a' and `b', one of which
619 | is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
620 | signaling NaN, the invalid exception is raised.
621 *----------------------------------------------------------------------------*/
623 static float32
propagateFloat32NaN(float32 a
, float32 b
, float_status
*status
)
625 flag aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
;
626 flag aIsLargerSignificand
;
629 aIsQuietNaN
= float32_is_quiet_nan( a
);
630 aIsSignalingNaN
= float32_is_signaling_nan( a
);
631 bIsQuietNaN
= float32_is_quiet_nan( b
);
632 bIsSignalingNaN
= float32_is_signaling_nan( b
);
636 if (aIsSignalingNaN
| bIsSignalingNaN
) {
637 float_raise(float_flag_invalid
, status
);
640 if (status
->default_nan_mode
)
641 return float32_default_nan
;
643 if ((uint32_t)(av
<<1) < (uint32_t)(bv
<<1)) {
644 aIsLargerSignificand
= 0;
645 } else if ((uint32_t)(bv
<<1) < (uint32_t)(av
<<1)) {
646 aIsLargerSignificand
= 1;
648 aIsLargerSignificand
= (av
< bv
) ? 1 : 0;
651 if (pickNaN(aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
,
652 aIsLargerSignificand
)) {
653 return float32_maybe_silence_nan(b
);
655 return float32_maybe_silence_nan(a
);
659 /*----------------------------------------------------------------------------
660 | Takes three single-precision floating-point values `a', `b' and `c', one of
661 | which is a NaN, and returns the appropriate NaN result. If any of `a',
662 | `b' or `c' is a signaling NaN, the invalid exception is raised.
663 | The input infzero indicates whether a*b was 0*inf or inf*0 (in which case
664 | obviously c is a NaN, and whether to propagate c or some other NaN is
665 | implementation defined).
666 *----------------------------------------------------------------------------*/
668 static float32
propagateFloat32MulAddNaN(float32 a
, float32 b
,
669 float32 c
, flag infzero
,
670 float_status
*status
)
672 flag aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
,
673 cIsQuietNaN
, cIsSignalingNaN
;
676 aIsQuietNaN
= float32_is_quiet_nan(a
);
677 aIsSignalingNaN
= float32_is_signaling_nan(a
);
678 bIsQuietNaN
= float32_is_quiet_nan(b
);
679 bIsSignalingNaN
= float32_is_signaling_nan(b
);
680 cIsQuietNaN
= float32_is_quiet_nan(c
);
681 cIsSignalingNaN
= float32_is_signaling_nan(c
);
683 if (aIsSignalingNaN
| bIsSignalingNaN
| cIsSignalingNaN
) {
684 float_raise(float_flag_invalid
, status
);
687 which
= pickNaNMulAdd(aIsQuietNaN
, aIsSignalingNaN
,
688 bIsQuietNaN
, bIsSignalingNaN
,
689 cIsQuietNaN
, cIsSignalingNaN
, infzero
, status
);
691 if (status
->default_nan_mode
) {
692 /* Note that this check is after pickNaNMulAdd so that function
693 * has an opportunity to set the Invalid flag.
695 return float32_default_nan
;
700 return float32_maybe_silence_nan(a
);
702 return float32_maybe_silence_nan(b
);
704 return float32_maybe_silence_nan(c
);
707 return float32_default_nan
;
711 #ifdef NO_SIGNALING_NANS
712 int float64_is_quiet_nan(float64 a_
)
714 return float64_is_any_nan(a_
);
717 int float64_is_signaling_nan(float64 a_
)
722 /*----------------------------------------------------------------------------
723 | Returns 1 if the double-precision floating-point value `a' is a quiet
724 | NaN; otherwise returns 0.
725 *----------------------------------------------------------------------------*/
727 int float64_is_quiet_nan( float64 a_
)
729 uint64_t a
= float64_val(a_
);
731 return (((a
>> 51) & 0xfff) == 0xffe)
732 && (a
& 0x0007ffffffffffffULL
);
734 return ((a
<< 1) >= 0xfff0000000000000ULL
);
738 /*----------------------------------------------------------------------------
739 | Returns 1 if the double-precision floating-point value `a' is a signaling
740 | NaN; otherwise returns 0.
741 *----------------------------------------------------------------------------*/
743 int float64_is_signaling_nan( float64 a_
)
745 uint64_t a
= float64_val(a_
);
747 return ((a
<< 1) >= 0xfff0000000000000ULL
);
750 ( ( ( a
>>51 ) & 0xFFF ) == 0xFFE )
751 && ( a
& LIT64( 0x0007FFFFFFFFFFFF ) );
756 /*----------------------------------------------------------------------------
757 | Returns a quiet NaN if the double-precision floating point value `a' is a
758 | signaling NaN; otherwise returns `a'.
759 *----------------------------------------------------------------------------*/
761 float64
float64_maybe_silence_nan( float64 a_
)
763 if (float64_is_signaling_nan(a_
)) {
765 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
766 return float64_default_nan
;
768 # error Rules for silencing a signaling NaN are target-specific
771 uint64_t a
= float64_val(a_
);
772 a
|= LIT64( 0x0008000000000000 );
773 return make_float64(a
);
779 /*----------------------------------------------------------------------------
780 | Returns the result of converting the double-precision floating-point NaN
781 | `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
782 | exception is raised.
783 *----------------------------------------------------------------------------*/
785 static commonNaNT
float64ToCommonNaN(float64 a
, float_status
*status
)
789 if (float64_is_signaling_nan(a
)) {
790 float_raise(float_flag_invalid
, status
);
792 z
.sign
= float64_val(a
)>>63;
794 z
.high
= float64_val(a
)<<12;
798 /*----------------------------------------------------------------------------
799 | Returns the result of converting the canonical NaN `a' to the double-
800 | precision floating-point format.
801 *----------------------------------------------------------------------------*/
803 static float64
commonNaNToFloat64(commonNaNT a
, float_status
*status
)
805 uint64_t mantissa
= a
.high
>>12;
807 if (status
->default_nan_mode
) {
808 return float64_default_nan
;
813 ( ( (uint64_t) a
.sign
)<<63 )
814 | LIT64( 0x7FF0000000000000 )
817 return float64_default_nan
;
820 /*----------------------------------------------------------------------------
821 | Takes two double-precision floating-point values `a' and `b', one of which
822 | is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
823 | signaling NaN, the invalid exception is raised.
824 *----------------------------------------------------------------------------*/
826 static float64
propagateFloat64NaN(float64 a
, float64 b
, float_status
*status
)
828 flag aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
;
829 flag aIsLargerSignificand
;
832 aIsQuietNaN
= float64_is_quiet_nan( a
);
833 aIsSignalingNaN
= float64_is_signaling_nan( a
);
834 bIsQuietNaN
= float64_is_quiet_nan( b
);
835 bIsSignalingNaN
= float64_is_signaling_nan( b
);
839 if (aIsSignalingNaN
| bIsSignalingNaN
) {
840 float_raise(float_flag_invalid
, status
);
843 if (status
->default_nan_mode
)
844 return float64_default_nan
;
846 if ((uint64_t)(av
<<1) < (uint64_t)(bv
<<1)) {
847 aIsLargerSignificand
= 0;
848 } else if ((uint64_t)(bv
<<1) < (uint64_t)(av
<<1)) {
849 aIsLargerSignificand
= 1;
851 aIsLargerSignificand
= (av
< bv
) ? 1 : 0;
854 if (pickNaN(aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
,
855 aIsLargerSignificand
)) {
856 return float64_maybe_silence_nan(b
);
858 return float64_maybe_silence_nan(a
);
862 /*----------------------------------------------------------------------------
863 | Takes three double-precision floating-point values `a', `b' and `c', one of
864 | which is a NaN, and returns the appropriate NaN result. If any of `a',
865 | `b' or `c' is a signaling NaN, the invalid exception is raised.
866 | The input infzero indicates whether a*b was 0*inf or inf*0 (in which case
867 | obviously c is a NaN, and whether to propagate c or some other NaN is
868 | implementation defined).
869 *----------------------------------------------------------------------------*/
871 static float64
propagateFloat64MulAddNaN(float64 a
, float64 b
,
872 float64 c
, flag infzero
,
873 float_status
*status
)
875 flag aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
,
876 cIsQuietNaN
, cIsSignalingNaN
;
879 aIsQuietNaN
= float64_is_quiet_nan(a
);
880 aIsSignalingNaN
= float64_is_signaling_nan(a
);
881 bIsQuietNaN
= float64_is_quiet_nan(b
);
882 bIsSignalingNaN
= float64_is_signaling_nan(b
);
883 cIsQuietNaN
= float64_is_quiet_nan(c
);
884 cIsSignalingNaN
= float64_is_signaling_nan(c
);
886 if (aIsSignalingNaN
| bIsSignalingNaN
| cIsSignalingNaN
) {
887 float_raise(float_flag_invalid
, status
);
890 which
= pickNaNMulAdd(aIsQuietNaN
, aIsSignalingNaN
,
891 bIsQuietNaN
, bIsSignalingNaN
,
892 cIsQuietNaN
, cIsSignalingNaN
, infzero
, status
);
894 if (status
->default_nan_mode
) {
895 /* Note that this check is after pickNaNMulAdd so that function
896 * has an opportunity to set the Invalid flag.
898 return float64_default_nan
;
903 return float64_maybe_silence_nan(a
);
905 return float64_maybe_silence_nan(b
);
907 return float64_maybe_silence_nan(c
);
910 return float64_default_nan
;
914 #ifdef NO_SIGNALING_NANS
915 int floatx80_is_quiet_nan(floatx80 a_
)
917 return floatx80_is_any_nan(a_
);
920 int floatx80_is_signaling_nan(floatx80 a_
)
925 /*----------------------------------------------------------------------------
926 | Returns 1 if the extended double-precision floating-point value `a' is a
927 | quiet NaN; otherwise returns 0. This slightly differs from the same
928 | function for other types as floatx80 has an explicit bit.
929 *----------------------------------------------------------------------------*/
931 int floatx80_is_quiet_nan( floatx80 a
)
936 aLow
= a
.low
& ~0x4000000000000000ULL
;
937 return ((a
.high
& 0x7fff) == 0x7fff)
941 return ( ( a
.high
& 0x7FFF ) == 0x7FFF )
942 && (LIT64( 0x8000000000000000 ) <= ((uint64_t) ( a
.low
<<1 )));
946 /*----------------------------------------------------------------------------
947 | Returns 1 if the extended double-precision floating-point value `a' is a
948 | signaling NaN; otherwise returns 0. This slightly differs from the same
949 | function for other types as floatx80 has an explicit bit.
950 *----------------------------------------------------------------------------*/
952 int floatx80_is_signaling_nan( floatx80 a
)
955 return ((a
.high
& 0x7fff) == 0x7fff)
956 && ((a
.low
<< 1) >= 0x8000000000000000ULL
);
960 aLow
= a
.low
& ~ LIT64( 0x4000000000000000 );
962 ( ( a
.high
& 0x7FFF ) == 0x7FFF )
963 && (uint64_t) ( aLow
<<1 )
964 && ( a
.low
== aLow
);
969 /*----------------------------------------------------------------------------
970 | Returns a quiet NaN if the extended double-precision floating point value
971 | `a' is a signaling NaN; otherwise returns `a'.
972 *----------------------------------------------------------------------------*/
974 floatx80
floatx80_maybe_silence_nan( floatx80 a
)
976 if (floatx80_is_signaling_nan(a
)) {
978 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
979 a
.low
= floatx80_default_nan_low
;
980 a
.high
= floatx80_default_nan_high
;
982 # error Rules for silencing a signaling NaN are target-specific
985 a
.low
|= LIT64( 0xC000000000000000 );
992 /*----------------------------------------------------------------------------
993 | Returns the result of converting the extended double-precision floating-
994 | point NaN `a' to the canonical NaN format. If `a' is a signaling NaN, the
995 | invalid exception is raised.
996 *----------------------------------------------------------------------------*/
998 static commonNaNT
floatx80ToCommonNaN(floatx80 a
, float_status
*status
)
1002 if (floatx80_is_signaling_nan(a
)) {
1003 float_raise(float_flag_invalid
, status
);
1005 if ( a
.low
>> 63 ) {
1006 z
.sign
= a
.high
>> 15;
1008 z
.high
= a
.low
<< 1;
1010 z
.sign
= floatx80_default_nan_high
>> 15;
1012 z
.high
= floatx80_default_nan_low
<< 1;
1017 /*----------------------------------------------------------------------------
1018 | Returns the result of converting the canonical NaN `a' to the extended
1019 | double-precision floating-point format.
1020 *----------------------------------------------------------------------------*/
1022 static floatx80
commonNaNToFloatx80(commonNaNT a
, float_status
*status
)
1026 if (status
->default_nan_mode
) {
1027 z
.low
= floatx80_default_nan_low
;
1028 z
.high
= floatx80_default_nan_high
;
1033 z
.low
= LIT64( 0x8000000000000000 ) | a
.high
>> 1;
1034 z
.high
= ( ( (uint16_t) a
.sign
)<<15 ) | 0x7FFF;
1036 z
.low
= floatx80_default_nan_low
;
1037 z
.high
= floatx80_default_nan_high
;
1043 /*----------------------------------------------------------------------------
1044 | Takes two extended double-precision floating-point values `a' and `b', one
1045 | of which is a NaN, and returns the appropriate NaN result. If either `a' or
1046 | `b' is a signaling NaN, the invalid exception is raised.
1047 *----------------------------------------------------------------------------*/
1049 static floatx80
propagateFloatx80NaN(floatx80 a
, floatx80 b
,
1050 float_status
*status
)
1052 flag aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
;
1053 flag aIsLargerSignificand
;
1055 aIsQuietNaN
= floatx80_is_quiet_nan( a
);
1056 aIsSignalingNaN
= floatx80_is_signaling_nan( a
);
1057 bIsQuietNaN
= floatx80_is_quiet_nan( b
);
1058 bIsSignalingNaN
= floatx80_is_signaling_nan( b
);
1060 if (aIsSignalingNaN
| bIsSignalingNaN
) {
1061 float_raise(float_flag_invalid
, status
);
1064 if (status
->default_nan_mode
) {
1065 a
.low
= floatx80_default_nan_low
;
1066 a
.high
= floatx80_default_nan_high
;
1070 if (a
.low
< b
.low
) {
1071 aIsLargerSignificand
= 0;
1072 } else if (b
.low
< a
.low
) {
1073 aIsLargerSignificand
= 1;
1075 aIsLargerSignificand
= (a
.high
< b
.high
) ? 1 : 0;
1078 if (pickNaN(aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
,
1079 aIsLargerSignificand
)) {
1080 return floatx80_maybe_silence_nan(b
);
1082 return floatx80_maybe_silence_nan(a
);
1086 #ifdef NO_SIGNALING_NANS
1087 int float128_is_quiet_nan(float128 a_
)
1089 return float128_is_any_nan(a_
);
1092 int float128_is_signaling_nan(float128 a_
)
1097 /*----------------------------------------------------------------------------
1098 | Returns 1 if the quadruple-precision floating-point value `a' is a quiet
1099 | NaN; otherwise returns 0.
1100 *----------------------------------------------------------------------------*/
1102 int float128_is_quiet_nan( float128 a
)
1105 return (((a
.high
>> 47) & 0xffff) == 0xfffe)
1106 && (a
.low
|| (a
.high
& 0x00007fffffffffffULL
));
1109 ((a
.high
<< 1) >= 0xffff000000000000ULL
)
1110 && (a
.low
|| (a
.high
& 0x0000ffffffffffffULL
));
1114 /*----------------------------------------------------------------------------
1115 | Returns 1 if the quadruple-precision floating-point value `a' is a
1116 | signaling NaN; otherwise returns 0.
1117 *----------------------------------------------------------------------------*/
1119 int float128_is_signaling_nan( float128 a
)
1123 ((a
.high
<< 1) >= 0xffff000000000000ULL
)
1124 && (a
.low
|| (a
.high
& 0x0000ffffffffffffULL
));
1127 ( ( ( a
.high
>>47 ) & 0xFFFF ) == 0xFFFE )
1128 && ( a
.low
|| ( a
.high
& LIT64( 0x00007FFFFFFFFFFF ) ) );
1133 /*----------------------------------------------------------------------------
1134 | Returns a quiet NaN if the quadruple-precision floating point value `a' is
1135 | a signaling NaN; otherwise returns `a'.
1136 *----------------------------------------------------------------------------*/
1138 float128
float128_maybe_silence_nan( float128 a
)
1140 if (float128_is_signaling_nan(a
)) {
1142 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
1143 a
.low
= float128_default_nan_low
;
1144 a
.high
= float128_default_nan_high
;
1146 # error Rules for silencing a signaling NaN are target-specific
1149 a
.high
|= LIT64( 0x0000800000000000 );
1156 /*----------------------------------------------------------------------------
1157 | Returns the result of converting the quadruple-precision floating-point NaN
1158 | `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
1159 | exception is raised.
1160 *----------------------------------------------------------------------------*/
1162 static commonNaNT
float128ToCommonNaN(float128 a
, float_status
*status
)
1166 if (float128_is_signaling_nan(a
)) {
1167 float_raise(float_flag_invalid
, status
);
1169 z
.sign
= a
.high
>>63;
1170 shortShift128Left( a
.high
, a
.low
, 16, &z
.high
, &z
.low
);
1174 /*----------------------------------------------------------------------------
1175 | Returns the result of converting the canonical NaN `a' to the quadruple-
1176 | precision floating-point format.
1177 *----------------------------------------------------------------------------*/
1179 static float128
commonNaNToFloat128(commonNaNT a
, float_status
*status
)
1183 if (status
->default_nan_mode
) {
1184 z
.low
= float128_default_nan_low
;
1185 z
.high
= float128_default_nan_high
;
1189 shift128Right( a
.high
, a
.low
, 16, &z
.high
, &z
.low
);
1190 z
.high
|= ( ( (uint64_t) a
.sign
)<<63 ) | LIT64( 0x7FFF000000000000 );
1194 /*----------------------------------------------------------------------------
1195 | Takes two quadruple-precision floating-point values `a' and `b', one of
1196 | which is a NaN, and returns the appropriate NaN result. If either `a' or
1197 | `b' is a signaling NaN, the invalid exception is raised.
1198 *----------------------------------------------------------------------------*/
1200 static float128
propagateFloat128NaN(float128 a
, float128 b
,
1201 float_status
*status
)
1203 flag aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
;
1204 flag aIsLargerSignificand
;
1206 aIsQuietNaN
= float128_is_quiet_nan( a
);
1207 aIsSignalingNaN
= float128_is_signaling_nan( a
);
1208 bIsQuietNaN
= float128_is_quiet_nan( b
);
1209 bIsSignalingNaN
= float128_is_signaling_nan( b
);
1211 if (aIsSignalingNaN
| bIsSignalingNaN
) {
1212 float_raise(float_flag_invalid
, status
);
1215 if (status
->default_nan_mode
) {
1216 a
.low
= float128_default_nan_low
;
1217 a
.high
= float128_default_nan_high
;
1221 if (lt128(a
.high
<<1, a
.low
, b
.high
<<1, b
.low
)) {
1222 aIsLargerSignificand
= 0;
1223 } else if (lt128(b
.high
<<1, b
.low
, a
.high
<<1, a
.low
)) {
1224 aIsLargerSignificand
= 1;
1226 aIsLargerSignificand
= (a
.high
< b
.high
) ? 1 : 0;
1229 if (pickNaN(aIsQuietNaN
, aIsSignalingNaN
, bIsQuietNaN
, bIsSignalingNaN
,
1230 aIsLargerSignificand
)) {
1231 return float128_maybe_silence_nan(b
);
1233 return float128_maybe_silence_nan(a
);