xen/MSI-X: really enforce alignment
[qemu/ar7.git] / fpu / softfloat-specialize.h
blob6dd41d8978920bb2186ff906b62c962087fd8c41
1 /*
2 * QEMU float support
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
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 ===============================================================================
47 /* BSD licensing:
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
88 #else
89 #define SNAN_BIT_IS_ONE 0
90 #endif
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
97 #endif
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);
106 #else
107 const float16 float16_default_nan = const_float16(0xFE00);
108 #endif
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);
120 #else
121 const float32 float32_default_nan = const_float32(0xFFC00000);
122 #endif
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));
134 #else
135 const float64 float64_default_nan = const_float64(LIT64( 0xFFF8000000000000 ));
136 #endif
138 /*----------------------------------------------------------------------------
139 | The pattern for a default generated extended double-precision NaN.
140 *----------------------------------------------------------------------------*/
141 #if SNAN_BIT_IS_ONE
142 #define floatx80_default_nan_high 0x7FFF
143 #define floatx80_default_nan_low LIT64(0xBFFFFFFFFFFFFFFF)
144 #else
145 #define floatx80_default_nan_high 0xFFFF
146 #define floatx80_default_nan_low LIT64( 0xC000000000000000 )
147 #endif
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 *----------------------------------------------------------------------------*/
156 #if SNAN_BIT_IS_ONE
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 )
162 #else
163 #define float128_default_nan_high LIT64( 0xFFFF800000000000 )
164 #define float128_default_nan_low LIT64( 0x0000000000000000 )
165 #endif
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 flags, float_status *status)
179 status->float_exception_flags |= flags;
182 /*----------------------------------------------------------------------------
183 | Internal canonical NaN format.
184 *----------------------------------------------------------------------------*/
185 typedef struct {
186 flag sign;
187 uint64_t high, low;
188 } commonNaNT;
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_)
198 return 0;
200 #else
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_);
209 #if SNAN_BIT_IS_ONE
210 return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
211 #else
212 return ((a & ~0x8000) >= 0x7c80);
213 #endif
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_);
224 #if SNAN_BIT_IS_ONE
225 return ((a & ~0x8000) >= 0x7c80);
226 #else
227 return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
228 #endif
230 #endif
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_)) {
239 #if SNAN_BIT_IS_ONE
240 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
241 return float16_default_nan;
242 # else
243 # error Rules for silencing a signaling NaN are target-specific
244 # endif
245 #else
246 uint16_t a = float16_val(a_);
247 a |= (1 << 9);
248 return make_float16(a);
249 #endif
251 return 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)
262 commonNaNT z;
264 if (float16_is_signaling_nan(a)) {
265 float_raise(float_flag_invalid, status);
267 z.sign = float16_val(a) >> 15;
268 z.low = 0;
269 z.high = ((uint64_t) float16_val(a))<<54;
270 return z;
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;
286 if (mantissa) {
287 return make_float16(((((uint16_t) a.sign) << 15)
288 | (0x1F << 10) | mantissa));
289 } else {
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_)
302 return 0;
304 #else
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_);
313 #if SNAN_BIT_IS_ONE
314 return (((a >> 22) & 0x1ff) == 0x1fe) && (a & 0x003fffff);
315 #else
316 return ((uint32_t)(a << 1) >= 0xff800000);
317 #endif
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_);
328 #if SNAN_BIT_IS_ONE
329 return ((uint32_t)(a << 1) >= 0xff800000);
330 #else
331 return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
332 #endif
334 #endif
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_)) {
344 #if SNAN_BIT_IS_ONE
345 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
346 return float32_default_nan;
347 # else
348 # error Rules for silencing a signaling NaN are target-specific
349 # endif
350 #else
351 uint32_t a = float32_val(a_);
352 a |= (1 << 22);
353 return make_float32(a);
354 #endif
356 return 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)
367 commonNaNT z;
369 if (float32_is_signaling_nan(a)) {
370 float_raise(float_flag_invalid, status);
372 z.sign = float32_val(a)>>31;
373 z.low = 0;
374 z.high = ( (uint64_t) float32_val(a) )<<41;
375 return z;
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;
391 if ( mantissa )
392 return make_float32(
393 ( ( (uint32_t) a.sign )<<31 ) | 0x7F800000 | ( a.high>>41 ) );
394 else
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
406 | returning them.
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
412 | tie-break rule.
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
422 * 3. A (quiet)
423 * 4. B (quiet)
424 * A signaling NaN is always quietened before returning it.
426 if (aIsSNaN) {
427 return 0;
428 } else if (bIsSNaN) {
429 return 1;
430 } else if (aIsQNaN) {
431 return 0;
432 } else {
433 return 1;
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
449 * 3. A (quiet)
450 * 4. B (quiet)
451 * A signaling NaN is always silenced before returning it.
453 if (aIsSNaN) {
454 return 0;
455 } else if (bIsSNaN) {
456 return 1;
457 } else if (aIsQNaN) {
458 return 0;
459 } else {
460 return 1;
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) {
473 return 0;
474 } else {
475 return 1;
478 #else
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).
492 if (aIsSNaN) {
493 if (bIsSNaN) {
494 return aIsLargerSignificand ? 0 : 1;
496 return bIsQNaN ? 1 : 0;
498 else if (aIsQNaN) {
499 if (bIsSNaN || !bIsQNaN)
500 return 0;
501 else {
502 return aIsLargerSignificand ? 0 : 1;
504 } else {
505 return 1;
508 #endif
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'
513 | information.
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
522 * the default NaN
524 if (infzero && cIsQNaN) {
525 float_raise(float_flag_invalid, status);
526 return 3;
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.
532 if (cIsSNaN) {
533 return 2;
534 } else if (aIsSNaN) {
535 return 0;
536 } else if (bIsSNaN) {
537 return 1;
538 } else if (cIsQNaN) {
539 return 2;
540 } else if (aIsQNaN) {
541 return 0;
542 } else {
543 return 1;
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
552 * the default NaN
554 if (infzero) {
555 float_raise(float_flag_invalid, status);
556 return 3;
559 /* Prefer sNaN over qNaN, in the a, b, c order. */
560 if (aIsSNaN) {
561 return 0;
562 } else if (bIsSNaN) {
563 return 1;
564 } else if (cIsSNaN) {
565 return 2;
566 } else if (aIsQNaN) {
567 return 0;
568 } else if (bIsQNaN) {
569 return 1;
570 } else {
571 return 2;
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
581 * a default NaN
583 if (infzero) {
584 float_raise(float_flag_invalid, status);
585 return 2;
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) {
592 return 0;
593 } else if (cIsSNaN || cIsQNaN) {
594 return 2;
595 } else {
596 return 1;
599 #else
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) {
608 return 0;
609 } else if (bIsSNaN || bIsQNaN) {
610 return 1;
611 } else {
612 return 2;
615 #endif
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;
627 uint32_t av, bv;
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 );
633 av = float32_val(a);
634 bv = float32_val(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;
647 } else {
648 aIsLargerSignificand = (av < bv) ? 1 : 0;
651 if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
652 aIsLargerSignificand)) {
653 return float32_maybe_silence_nan(b);
654 } else {
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;
674 int which;
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;
698 switch (which) {
699 case 0:
700 return float32_maybe_silence_nan(a);
701 case 1:
702 return float32_maybe_silence_nan(b);
703 case 2:
704 return float32_maybe_silence_nan(c);
705 case 3:
706 default:
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_)
719 return 0;
721 #else
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_);
730 #if SNAN_BIT_IS_ONE
731 return (((a >> 51) & 0xfff) == 0xffe)
732 && (a & 0x0007ffffffffffffULL);
733 #else
734 return ((a << 1) >= 0xfff0000000000000ULL);
735 #endif
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_);
746 #if SNAN_BIT_IS_ONE
747 return ((a << 1) >= 0xfff0000000000000ULL);
748 #else
749 return
750 ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
751 && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
752 #endif
754 #endif
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_)) {
764 #if SNAN_BIT_IS_ONE
765 # if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
766 return float64_default_nan;
767 # else
768 # error Rules for silencing a signaling NaN are target-specific
769 # endif
770 #else
771 uint64_t a = float64_val(a_);
772 a |= LIT64( 0x0008000000000000 );
773 return make_float64(a);
774 #endif
776 return 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)
787 commonNaNT z;
789 if (float64_is_signaling_nan(a)) {
790 float_raise(float_flag_invalid, status);
792 z.sign = float64_val(a)>>63;
793 z.low = 0;
794 z.high = float64_val(a)<<12;
795 return z;
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;
811 if ( mantissa )
812 return make_float64(
813 ( ( (uint64_t) a.sign )<<63 )
814 | LIT64( 0x7FF0000000000000 )
815 | ( a.high>>12 ));
816 else
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;
830 uint64_t av, bv;
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 );
836 av = float64_val(a);
837 bv = float64_val(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;
850 } else {
851 aIsLargerSignificand = (av < bv) ? 1 : 0;
854 if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
855 aIsLargerSignificand)) {
856 return float64_maybe_silence_nan(b);
857 } else {
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;
877 int which;
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;
901 switch (which) {
902 case 0:
903 return float64_maybe_silence_nan(a);
904 case 1:
905 return float64_maybe_silence_nan(b);
906 case 2:
907 return float64_maybe_silence_nan(c);
908 case 3:
909 default:
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_)
922 return 0;
924 #else
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 )
933 #if SNAN_BIT_IS_ONE
934 uint64_t aLow;
936 aLow = a.low & ~0x4000000000000000ULL;
937 return ((a.high & 0x7fff) == 0x7fff)
938 && (aLow << 1)
939 && (a.low == aLow);
940 #else
941 return ( ( a.high & 0x7FFF ) == 0x7FFF )
942 && (LIT64( 0x8000000000000000 ) <= ((uint64_t) ( a.low<<1 )));
943 #endif
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 )
954 #if SNAN_BIT_IS_ONE
955 return ((a.high & 0x7fff) == 0x7fff)
956 && ((a.low << 1) >= 0x8000000000000000ULL);
957 #else
958 uint64_t aLow;
960 aLow = a.low & ~ LIT64( 0x4000000000000000 );
961 return
962 ( ( a.high & 0x7FFF ) == 0x7FFF )
963 && (uint64_t) ( aLow<<1 )
964 && ( a.low == aLow );
965 #endif
967 #endif
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)) {
977 #if SNAN_BIT_IS_ONE
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;
981 # else
982 # error Rules for silencing a signaling NaN are target-specific
983 # endif
984 #else
985 a.low |= LIT64( 0xC000000000000000 );
986 return a;
987 #endif
989 return a;
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)
1000 commonNaNT z;
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;
1007 z.low = 0;
1008 z.high = a.low << 1;
1009 } else {
1010 z.sign = floatx80_default_nan_high >> 15;
1011 z.low = 0;
1012 z.high = floatx80_default_nan_low << 1;
1014 return z;
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)
1024 floatx80 z;
1026 if (status->default_nan_mode) {
1027 z.low = floatx80_default_nan_low;
1028 z.high = floatx80_default_nan_high;
1029 return z;
1032 if (a.high >> 1) {
1033 z.low = LIT64( 0x8000000000000000 ) | a.high >> 1;
1034 z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF;
1035 } else {
1036 z.low = floatx80_default_nan_low;
1037 z.high = floatx80_default_nan_high;
1040 return z;
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;
1067 return a;
1070 if (a.low < b.low) {
1071 aIsLargerSignificand = 0;
1072 } else if (b.low < a.low) {
1073 aIsLargerSignificand = 1;
1074 } else {
1075 aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
1078 if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
1079 aIsLargerSignificand)) {
1080 return floatx80_maybe_silence_nan(b);
1081 } else {
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_)
1094 return 0;
1096 #else
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 )
1104 #if SNAN_BIT_IS_ONE
1105 return (((a.high >> 47) & 0xffff) == 0xfffe)
1106 && (a.low || (a.high & 0x00007fffffffffffULL));
1107 #else
1108 return
1109 ((a.high << 1) >= 0xffff000000000000ULL)
1110 && (a.low || (a.high & 0x0000ffffffffffffULL));
1111 #endif
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 )
1121 #if SNAN_BIT_IS_ONE
1122 return
1123 ((a.high << 1) >= 0xffff000000000000ULL)
1124 && (a.low || (a.high & 0x0000ffffffffffffULL));
1125 #else
1126 return
1127 ( ( ( a.high>>47 ) & 0xFFFF ) == 0xFFFE )
1128 && ( a.low || ( a.high & LIT64( 0x00007FFFFFFFFFFF ) ) );
1129 #endif
1131 #endif
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)) {
1141 #if SNAN_BIT_IS_ONE
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;
1145 # else
1146 # error Rules for silencing a signaling NaN are target-specific
1147 # endif
1148 #else
1149 a.high |= LIT64( 0x0000800000000000 );
1150 return a;
1151 #endif
1153 return a;
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)
1164 commonNaNT z;
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 );
1171 return z;
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)
1181 float128 z;
1183 if (status->default_nan_mode) {
1184 z.low = float128_default_nan_low;
1185 z.high = float128_default_nan_high;
1186 return z;
1189 shift128Right( a.high, a.low, 16, &z.high, &z.low );
1190 z.high |= ( ( (uint64_t) a.sign )<<63 ) | LIT64( 0x7FFF000000000000 );
1191 return z;
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;
1218 return a;
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;
1225 } else {
1226 aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
1229 if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
1230 aIsLargerSignificand)) {
1231 return float128_maybe_silence_nan(b);
1232 } else {
1233 return float128_maybe_silence_nan(a);