]> Git Repo - qemu.git/blame - include/fpu/softfloat.h
Merge remote-tracking branch 'remotes/gkurz/tags/for-upstream' into staging
[qemu.git] / include / fpu / softfloat.h
CommitLineData
8d725fac
AF
1/*
2 * QEMU float support
3 *
16017c48
PM
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.
8d725fac
AF
16 */
17
a7d1ac78
PM
18/*
19===============================================================================
20This C header file is part of the SoftFloat IEC/IEEE Floating-point
21Arithmetic Package, Release 2a.
158142c2
FB
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
a7d1ac78 30is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
158142c2
FB
31arithmetic/SoftFloat.html'.
32
a7d1ac78
PM
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.
158142c2
FB
38
39Derivative works are acceptable, even for commercial purposes, so long as
a7d1ac78
PM
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.
158142c2 43
a7d1ac78
PM
44===============================================================================
45*/
158142c2 46
16017c48
PM
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
158142c2
FB
82#ifndef SOFTFLOAT_H
83#define SOFTFLOAT_H
84
75b5a697 85#if defined(CONFIG_SOLARIS) && defined(CONFIG_NEEDS_LIBSUNMATH)
0475a5ca
TS
86#include <sunmath.h>
87#endif
88
158142c2 89#include <inttypes.h>
789ec7ce 90#include "config-host.h"
1de7afc9 91#include "qemu/osdep.h"
158142c2
FB
92
93/*----------------------------------------------------------------------------
94| Each of the following `typedef's defines the most convenient type that holds
95| integers of at least as many bits as specified. For example, `uint8' should
96| be the most convenient type that can hold unsigned integers of as many as
97| 8 bits. The `flag' type must be able to hold either a 0 or 1. For most
98| implementations of C, `flag', `uint8', and `int8' should all be `typedef'ed
99| to the same as `int'.
100*----------------------------------------------------------------------------*/
750afe93 101typedef uint8_t flag;
158142c2
FB
102typedef uint8_t uint8;
103typedef int8_t int8;
158142c2
FB
104typedef unsigned int uint32;
105typedef signed int int32;
106typedef uint64_t uint64;
107typedef int64_t int64;
108
158142c2 109#define LIT64( a ) a##LL
158142c2 110
1d6bda35
FB
111/*----------------------------------------------------------------------------
112| Software IEC/IEEE floating-point ordering relations
113*----------------------------------------------------------------------------*/
114enum {
115 float_relation_less = -1,
116 float_relation_equal = 0,
117 float_relation_greater = 1,
118 float_relation_unordered = 2
119};
120
158142c2
FB
121/*----------------------------------------------------------------------------
122| Software IEC/IEEE floating-point types.
123*----------------------------------------------------------------------------*/
f090c9d4
PB
124/* Use structures for soft-float types. This prevents accidentally mixing
125 them with native int/float types. A sufficiently clever compiler and
126 sane ABI should be able to see though these structs. However
127 x86/gcc 3.x seems to struggle a bit, so leave them disabled by default. */
128//#define USE_SOFTFLOAT_STRUCT_TYPES
129#ifdef USE_SOFTFLOAT_STRUCT_TYPES
bb4d4bb3
PM
130typedef struct {
131 uint16_t v;
132} float16;
133#define float16_val(x) (((float16)(x)).v)
134#define make_float16(x) __extension__ ({ float16 f16_val = {x}; f16_val; })
d5138cf4 135#define const_float16(x) { x }
f090c9d4
PB
136typedef struct {
137 uint32_t v;
138} float32;
139/* The cast ensures an error if the wrong type is passed. */
140#define float32_val(x) (((float32)(x)).v)
141#define make_float32(x) __extension__ ({ float32 f32_val = {x}; f32_val; })
d5138cf4 142#define const_float32(x) { x }
f090c9d4
PB
143typedef struct {
144 uint64_t v;
145} float64;
146#define float64_val(x) (((float64)(x)).v)
147#define make_float64(x) __extension__ ({ float64 f64_val = {x}; f64_val; })
d5138cf4 148#define const_float64(x) { x }
f090c9d4 149#else
bb4d4bb3 150typedef uint16_t float16;
158142c2
FB
151typedef uint32_t float32;
152typedef uint64_t float64;
bb4d4bb3 153#define float16_val(x) (x)
f090c9d4
PB
154#define float32_val(x) (x)
155#define float64_val(x) (x)
bb4d4bb3 156#define make_float16(x) (x)
f090c9d4
PB
157#define make_float32(x) (x)
158#define make_float64(x) (x)
d5138cf4
PM
159#define const_float16(x) (x)
160#define const_float32(x) (x)
161#define const_float64(x) (x)
f090c9d4 162#endif
158142c2
FB
163typedef struct {
164 uint64_t low;
165 uint16_t high;
166} floatx80;
f3218a8d 167#define make_floatx80(exp, mant) ((floatx80) { mant, exp })
3bf7e40a 168#define make_floatx80_init(exp, mant) { .low = mant, .high = exp }
158142c2 169typedef struct {
e2542fe2 170#ifdef HOST_WORDS_BIGENDIAN
158142c2
FB
171 uint64_t high, low;
172#else
173 uint64_t low, high;
174#endif
175} float128;
789ec7ce 176#define make_float128(high_, low_) ((float128) { .high = high_, .low = low_ })
3bf7e40a 177#define make_float128_init(high_, low_) { .high = high_, .low = low_ }
158142c2
FB
178
179/*----------------------------------------------------------------------------
180| Software IEC/IEEE floating-point underflow tininess-detection mode.
181*----------------------------------------------------------------------------*/
182enum {
183 float_tininess_after_rounding = 0,
184 float_tininess_before_rounding = 1
185};
186
187/*----------------------------------------------------------------------------
188| Software IEC/IEEE floating-point rounding mode.
189*----------------------------------------------------------------------------*/
190enum {
191 float_round_nearest_even = 0,
192 float_round_down = 1,
193 float_round_up = 2,
f9288a76
PM
194 float_round_to_zero = 3,
195 float_round_ties_away = 4,
158142c2
FB
196};
197
198/*----------------------------------------------------------------------------
199| Software IEC/IEEE floating-point exception flags.
200*----------------------------------------------------------------------------*/
201enum {
202 float_flag_invalid = 1,
203 float_flag_divbyzero = 4,
204 float_flag_overflow = 8,
205 float_flag_underflow = 16,
37d18660 206 float_flag_inexact = 32,
e6afc87f
PM
207 float_flag_input_denormal = 64,
208 float_flag_output_denormal = 128
158142c2
FB
209};
210
211typedef struct float_status {
212 signed char float_detect_tininess;
213 signed char float_rounding_mode;
214 signed char float_exception_flags;
158142c2 215 signed char floatx80_rounding_precision;
37d18660 216 /* should denormalised results go to zero and set the inexact flag? */
fe76d976 217 flag flush_to_zero;
37d18660
PM
218 /* should denormalised inputs go to zero and set the input_denormal flag? */
219 flag flush_inputs_to_zero;
5c7908ed 220 flag default_nan_mode;
158142c2
FB
221} float_status;
222
e5a41ffa 223static inline void set_float_detect_tininess(int val, float_status *status)
c29aca44 224{
a2f2d288 225 status->float_detect_tininess = val;
c29aca44 226}
e5a41ffa 227static inline void set_float_rounding_mode(int val, float_status *status)
879d096b 228{
a2f2d288 229 status->float_rounding_mode = val;
879d096b 230}
e5a41ffa 231static inline void set_float_exception_flags(int val, float_status *status)
879d096b 232{
a2f2d288 233 status->float_exception_flags = val;
879d096b 234}
e5a41ffa
PM
235static inline void set_floatx80_rounding_precision(int val,
236 float_status *status)
879d096b 237{
a2f2d288 238 status->floatx80_rounding_precision = val;
879d096b 239}
e5a41ffa 240static inline void set_flush_to_zero(flag val, float_status *status)
fe76d976 241{
a2f2d288 242 status->flush_to_zero = val;
fe76d976 243}
e5a41ffa 244static inline void set_flush_inputs_to_zero(flag val, float_status *status)
37d18660 245{
a2f2d288 246 status->flush_inputs_to_zero = val;
37d18660 247}
e5a41ffa 248static inline void set_default_nan_mode(flag val, float_status *status)
5c7908ed 249{
a2f2d288 250 status->default_nan_mode = val;
5c7908ed 251}
a49db98d 252static inline int get_float_detect_tininess(float_status *status)
879d096b 253{
a2f2d288 254 return status->float_detect_tininess;
879d096b 255}
a49db98d 256static inline int get_float_rounding_mode(float_status *status)
879d096b 257{
a2f2d288 258 return status->float_rounding_mode;
879d096b 259}
a49db98d 260static inline int get_float_exception_flags(float_status *status)
1d6bda35 261{
a2f2d288 262 return status->float_exception_flags;
1d6bda35 263}
a49db98d 264static inline int get_floatx80_rounding_precision(float_status *status)
879d096b 265{
a2f2d288 266 return status->floatx80_rounding_precision;
879d096b 267}
a49db98d 268static inline flag get_flush_to_zero(float_status *status)
879d096b 269{
a2f2d288 270 return status->flush_to_zero;
879d096b 271}
a49db98d 272static inline flag get_flush_inputs_to_zero(float_status *status)
879d096b 273{
a2f2d288 274 return status->flush_inputs_to_zero;
879d096b 275}
a49db98d 276static inline flag get_default_nan_mode(float_status *status)
879d096b 277{
a2f2d288 278 return status->default_nan_mode;
879d096b 279}
158142c2
FB
280
281/*----------------------------------------------------------------------------
282| Routine to raise any or all of the software IEC/IEEE floating-point
283| exception flags.
284*----------------------------------------------------------------------------*/
e5a41ffa 285void float_raise(int8 flags, float_status *status);
158142c2 286
7baeabce
AB
287/*----------------------------------------------------------------------------
288| If `a' is denormal and we are in flush-to-zero mode then set the
289| input-denormal exception and return zero. Otherwise just return the value.
290*----------------------------------------------------------------------------*/
e5a41ffa
PM
291float32 float32_squash_input_denormal(float32 a, float_status *status);
292float64 float64_squash_input_denormal(float64 a, float_status *status);
7baeabce 293
369be8f6
PM
294/*----------------------------------------------------------------------------
295| Options to indicate which negations to perform in float*_muladd()
296| Using these differs from negating an input or output before calling
297| the muladd function in that this means that a NaN doesn't have its
298| sign bit inverted before it is propagated.
67d43538
PM
299| We also support halving the result before rounding, as a special
300| case to support the ARM fused-sqrt-step instruction FRSQRTS.
369be8f6
PM
301*----------------------------------------------------------------------------*/
302enum {
303 float_muladd_negate_c = 1,
304 float_muladd_negate_product = 2,
66176802 305 float_muladd_negate_result = 4,
67d43538 306 float_muladd_halve_result = 8,
369be8f6
PM
307};
308
158142c2
FB
309/*----------------------------------------------------------------------------
310| Software IEC/IEEE integer-to-floating-point conversion routines.
311*----------------------------------------------------------------------------*/
e5a41ffa
PM
312float32 int32_to_float32(int32_t, float_status *status);
313float64 int32_to_float64(int32_t, float_status *status);
314float32 uint32_to_float32(uint32_t, float_status *status);
315float64 uint32_to_float64(uint32_t, float_status *status);
316floatx80 int32_to_floatx80(int32_t, float_status *status);
317float128 int32_to_float128(int32_t, float_status *status);
318float32 int64_to_float32(int64_t, float_status *status);
319float64 int64_to_float64(int64_t, float_status *status);
320floatx80 int64_to_floatx80(int64_t, float_status *status);
321float128 int64_to_float128(int64_t, float_status *status);
322float32 uint64_to_float32(uint64_t, float_status *status);
323float64 uint64_to_float64(uint64_t, float_status *status);
324float128 uint64_to_float128(uint64_t, float_status *status);
158142c2 325
8afbdaba 326/* We provide the int16 versions for symmetry of API with float-to-int */
e5a41ffa 327static inline float32 int16_to_float32(int16_t v, float_status *status)
8afbdaba 328{
ff32e16e 329 return int32_to_float32(v, status);
8afbdaba
PM
330}
331
e5a41ffa 332static inline float32 uint16_to_float32(uint16_t v, float_status *status)
8afbdaba 333{
ff32e16e 334 return uint32_to_float32(v, status);
8afbdaba
PM
335}
336
e5a41ffa 337static inline float64 int16_to_float64(int16_t v, float_status *status)
8afbdaba 338{
ff32e16e 339 return int32_to_float64(v, status);
8afbdaba
PM
340}
341
e5a41ffa 342static inline float64 uint16_to_float64(uint16_t v, float_status *status)
8afbdaba 343{
ff32e16e 344 return uint32_to_float64(v, status);
8afbdaba
PM
345}
346
60011498
PB
347/*----------------------------------------------------------------------------
348| Software half-precision conversion routines.
349*----------------------------------------------------------------------------*/
e5a41ffa
PM
350float16 float32_to_float16(float32, flag, float_status *status);
351float32 float16_to_float32(float16, flag, float_status *status);
352float16 float64_to_float16(float64 a, flag ieee, float_status *status);
353float64 float16_to_float64(float16 a, flag ieee, float_status *status);
bb4d4bb3
PM
354
355/*----------------------------------------------------------------------------
356| Software half-precision operations.
357*----------------------------------------------------------------------------*/
358int float16_is_quiet_nan( float16 );
359int float16_is_signaling_nan( float16 );
360float16 float16_maybe_silence_nan( float16 );
60011498 361
a49db98d 362static inline int float16_is_any_nan(float16 a)
213ff4e6
MF
363{
364 return ((float16_val(a) & ~0x8000) > 0x7c00);
365}
366
8559666d
CL
367/*----------------------------------------------------------------------------
368| The pattern for a default generated half-precision NaN.
369*----------------------------------------------------------------------------*/
789ec7ce 370extern const float16 float16_default_nan;
8559666d 371
158142c2
FB
372/*----------------------------------------------------------------------------
373| Software IEC/IEEE single-precision conversion routines.
374*----------------------------------------------------------------------------*/
e5a41ffa
PM
375int_fast16_t float32_to_int16(float32, float_status *status);
376uint_fast16_t float32_to_uint16(float32, float_status *status);
377int_fast16_t float32_to_int16_round_to_zero(float32, float_status *status);
378uint_fast16_t float32_to_uint16_round_to_zero(float32, float_status *status);
379int32 float32_to_int32(float32, float_status *status);
380int32 float32_to_int32_round_to_zero(float32, float_status *status);
381uint32 float32_to_uint32(float32, float_status *status);
382uint32 float32_to_uint32_round_to_zero(float32, float_status *status);
383int64 float32_to_int64(float32, float_status *status);
384uint64 float32_to_uint64(float32, float_status *status);
385uint64 float32_to_uint64_round_to_zero(float32, float_status *status);
386int64 float32_to_int64_round_to_zero(float32, float_status *status);
387float64 float32_to_float64(float32, float_status *status);
388floatx80 float32_to_floatx80(float32, float_status *status);
389float128 float32_to_float128(float32, float_status *status);
158142c2
FB
390
391/*----------------------------------------------------------------------------
392| Software IEC/IEEE single-precision operations.
393*----------------------------------------------------------------------------*/
e5a41ffa
PM
394float32 float32_round_to_int(float32, float_status *status);
395float32 float32_add(float32, float32, float_status *status);
396float32 float32_sub(float32, float32, float_status *status);
397float32 float32_mul(float32, float32, float_status *status);
398float32 float32_div(float32, float32, float_status *status);
399float32 float32_rem(float32, float32, float_status *status);
400float32 float32_muladd(float32, float32, float32, int, float_status *status);
401float32 float32_sqrt(float32, float_status *status);
402float32 float32_exp2(float32, float_status *status);
403float32 float32_log2(float32, float_status *status);
404int float32_eq(float32, float32, float_status *status);
405int float32_le(float32, float32, float_status *status);
406int float32_lt(float32, float32, float_status *status);
407int float32_unordered(float32, float32, float_status *status);
408int float32_eq_quiet(float32, float32, float_status *status);
409int float32_le_quiet(float32, float32, float_status *status);
410int float32_lt_quiet(float32, float32, float_status *status);
411int float32_unordered_quiet(float32, float32, float_status *status);
412int float32_compare(float32, float32, float_status *status);
413int float32_compare_quiet(float32, float32, float_status *status);
414float32 float32_min(float32, float32, float_status *status);
415float32 float32_max(float32, float32, float_status *status);
416float32 float32_minnum(float32, float32, float_status *status);
417float32 float32_maxnum(float32, float32, float_status *status);
418float32 float32_minnummag(float32, float32, float_status *status);
419float32 float32_maxnummag(float32, float32, float_status *status);
18569871 420int float32_is_quiet_nan( float32 );
750afe93 421int float32_is_signaling_nan( float32 );
b408dbde 422float32 float32_maybe_silence_nan( float32 );
e5a41ffa 423float32 float32_scalbn(float32, int, float_status *status);
158142c2 424
a49db98d 425static inline float32 float32_abs(float32 a)
1d6bda35 426{
37d18660
PM
427 /* Note that abs does *not* handle NaN specially, nor does
428 * it flush denormal inputs to zero.
429 */
f090c9d4 430 return make_float32(float32_val(a) & 0x7fffffff);
1d6bda35
FB
431}
432
a49db98d 433static inline float32 float32_chs(float32 a)
1d6bda35 434{
37d18660
PM
435 /* Note that chs does *not* handle NaN specially, nor does
436 * it flush denormal inputs to zero.
437 */
f090c9d4 438 return make_float32(float32_val(a) ^ 0x80000000);
1d6bda35
FB
439}
440
a49db98d 441static inline int float32_is_infinity(float32 a)
c52ab6f5 442{
dadd71a7 443 return (float32_val(a) & 0x7fffffff) == 0x7f800000;
c52ab6f5
AJ
444}
445
a49db98d 446static inline int float32_is_neg(float32 a)
c52ab6f5
AJ
447{
448 return float32_val(a) >> 31;
449}
450
a49db98d 451static inline int float32_is_zero(float32 a)
c52ab6f5
AJ
452{
453 return (float32_val(a) & 0x7fffffff) == 0;
454}
455
a49db98d 456static inline int float32_is_any_nan(float32 a)
21d6ebde
PM
457{
458 return ((float32_val(a) & ~(1 << 31)) > 0x7f800000UL);
459}
460
a49db98d 461static inline int float32_is_zero_or_denormal(float32 a)
6f3300ad
PM
462{
463 return (float32_val(a) & 0x7f800000) == 0;
464}
465
a49db98d 466static inline float32 float32_set_sign(float32 a, int sign)
c30fe7df
CL
467{
468 return make_float32((float32_val(a) & 0x7fffffff) | (sign << 31));
469}
470
f090c9d4 471#define float32_zero make_float32(0)
196cfc89 472#define float32_one make_float32(0x3f800000)
8229c991 473#define float32_ln2 make_float32(0x3f317218)
c4b4c77a 474#define float32_pi make_float32(0x40490fdb)
c30fe7df
CL
475#define float32_half make_float32(0x3f000000)
476#define float32_infinity make_float32(0x7f800000)
f090c9d4 477
8559666d
CL
478
479/*----------------------------------------------------------------------------
480| The pattern for a default generated single-precision NaN.
481*----------------------------------------------------------------------------*/
789ec7ce 482extern const float32 float32_default_nan;
8559666d 483
158142c2
FB
484/*----------------------------------------------------------------------------
485| Software IEC/IEEE double-precision conversion routines.
486*----------------------------------------------------------------------------*/
e5a41ffa
PM
487int_fast16_t float64_to_int16(float64, float_status *status);
488uint_fast16_t float64_to_uint16(float64, float_status *status);
489int_fast16_t float64_to_int16_round_to_zero(float64, float_status *status);
490uint_fast16_t float64_to_uint16_round_to_zero(float64, float_status *status);
491int32 float64_to_int32(float64, float_status *status);
492int32 float64_to_int32_round_to_zero(float64, float_status *status);
493uint32 float64_to_uint32(float64, float_status *status);
494uint32 float64_to_uint32_round_to_zero(float64, float_status *status);
495int64 float64_to_int64(float64, float_status *status);
496int64 float64_to_int64_round_to_zero(float64, float_status *status);
497uint64 float64_to_uint64(float64 a, float_status *status);
498uint64 float64_to_uint64_round_to_zero(float64 a, float_status *status);
499float32 float64_to_float32(float64, float_status *status);
500floatx80 float64_to_floatx80(float64, float_status *status);
501float128 float64_to_float128(float64, float_status *status);
158142c2
FB
502
503/*----------------------------------------------------------------------------
504| Software IEC/IEEE double-precision operations.
505*----------------------------------------------------------------------------*/
e5a41ffa
PM
506float64 float64_round_to_int(float64, float_status *status);
507float64 float64_trunc_to_int(float64, float_status *status);
508float64 float64_add(float64, float64, float_status *status);
509float64 float64_sub(float64, float64, float_status *status);
510float64 float64_mul(float64, float64, float_status *status);
511float64 float64_div(float64, float64, float_status *status);
512float64 float64_rem(float64, float64, float_status *status);
513float64 float64_muladd(float64, float64, float64, int, float_status *status);
514float64 float64_sqrt(float64, float_status *status);
515float64 float64_log2(float64, float_status *status);
516int float64_eq(float64, float64, float_status *status);
517int float64_le(float64, float64, float_status *status);
518int float64_lt(float64, float64, float_status *status);
519int float64_unordered(float64, float64, float_status *status);
520int float64_eq_quiet(float64, float64, float_status *status);
521int float64_le_quiet(float64, float64, float_status *status);
522int float64_lt_quiet(float64, float64, float_status *status);
523int float64_unordered_quiet(float64, float64, float_status *status);
524int float64_compare(float64, float64, float_status *status);
525int float64_compare_quiet(float64, float64, float_status *status);
526float64 float64_min(float64, float64, float_status *status);
527float64 float64_max(float64, float64, float_status *status);
528float64 float64_minnum(float64, float64, float_status *status);
529float64 float64_maxnum(float64, float64, float_status *status);
530float64 float64_minnummag(float64, float64, float_status *status);
531float64 float64_maxnummag(float64, float64, float_status *status);
18569871 532int float64_is_quiet_nan( float64 a );
750afe93 533int float64_is_signaling_nan( float64 );
b408dbde 534float64 float64_maybe_silence_nan( float64 );
e5a41ffa 535float64 float64_scalbn(float64, int, float_status *status);
158142c2 536
a49db98d 537static inline float64 float64_abs(float64 a)
1d6bda35 538{
37d18660
PM
539 /* Note that abs does *not* handle NaN specially, nor does
540 * it flush denormal inputs to zero.
541 */
f090c9d4 542 return make_float64(float64_val(a) & 0x7fffffffffffffffLL);
1d6bda35
FB
543}
544
a49db98d 545static inline float64 float64_chs(float64 a)
1d6bda35 546{
37d18660
PM
547 /* Note that chs does *not* handle NaN specially, nor does
548 * it flush denormal inputs to zero.
549 */
f090c9d4 550 return make_float64(float64_val(a) ^ 0x8000000000000000LL);
1d6bda35
FB
551}
552
a49db98d 553static inline int float64_is_infinity(float64 a)
c52ab6f5
AJ
554{
555 return (float64_val(a) & 0x7fffffffffffffffLL ) == 0x7ff0000000000000LL;
556}
557
a49db98d 558static inline int float64_is_neg(float64 a)
c52ab6f5
AJ
559{
560 return float64_val(a) >> 63;
561}
562
a49db98d 563static inline int float64_is_zero(float64 a)
c52ab6f5
AJ
564{
565 return (float64_val(a) & 0x7fffffffffffffffLL) == 0;
566}
567
a49db98d 568static inline int float64_is_any_nan(float64 a)
21d6ebde
PM
569{
570 return ((float64_val(a) & ~(1ULL << 63)) > 0x7ff0000000000000ULL);
571}
572
a49db98d 573static inline int float64_is_zero_or_denormal(float64 a)
587eabfa
AJ
574{
575 return (float64_val(a) & 0x7ff0000000000000LL) == 0;
576}
577
a49db98d 578static inline float64 float64_set_sign(float64 a, int sign)
c30fe7df
CL
579{
580 return make_float64((float64_val(a) & 0x7fffffffffffffffULL)
581 | ((int64_t)sign << 63));
582}
583
f090c9d4 584#define float64_zero make_float64(0)
196cfc89 585#define float64_one make_float64(0x3ff0000000000000LL)
8229c991 586#define float64_ln2 make_float64(0x3fe62e42fefa39efLL)
c4b4c77a 587#define float64_pi make_float64(0x400921fb54442d18LL)
c30fe7df
CL
588#define float64_half make_float64(0x3fe0000000000000LL)
589#define float64_infinity make_float64(0x7ff0000000000000LL)
f090c9d4 590
8559666d
CL
591/*----------------------------------------------------------------------------
592| The pattern for a default generated double-precision NaN.
593*----------------------------------------------------------------------------*/
789ec7ce 594extern const float64 float64_default_nan;
8559666d 595
158142c2
FB
596/*----------------------------------------------------------------------------
597| Software IEC/IEEE extended double-precision conversion routines.
598*----------------------------------------------------------------------------*/
e5a41ffa
PM
599int32 floatx80_to_int32(floatx80, float_status *status);
600int32 floatx80_to_int32_round_to_zero(floatx80, float_status *status);
601int64 floatx80_to_int64(floatx80, float_status *status);
602int64 floatx80_to_int64_round_to_zero(floatx80, float_status *status);
603float32 floatx80_to_float32(floatx80, float_status *status);
604float64 floatx80_to_float64(floatx80, float_status *status);
605float128 floatx80_to_float128(floatx80, float_status *status);
158142c2
FB
606
607/*----------------------------------------------------------------------------
608| Software IEC/IEEE extended double-precision operations.
609*----------------------------------------------------------------------------*/
e5a41ffa
PM
610floatx80 floatx80_round_to_int(floatx80, float_status *status);
611floatx80 floatx80_add(floatx80, floatx80, float_status *status);
612floatx80 floatx80_sub(floatx80, floatx80, float_status *status);
613floatx80 floatx80_mul(floatx80, floatx80, float_status *status);
614floatx80 floatx80_div(floatx80, floatx80, float_status *status);
615floatx80 floatx80_rem(floatx80, floatx80, float_status *status);
616floatx80 floatx80_sqrt(floatx80, float_status *status);
617int floatx80_eq(floatx80, floatx80, float_status *status);
618int floatx80_le(floatx80, floatx80, float_status *status);
619int floatx80_lt(floatx80, floatx80, float_status *status);
620int floatx80_unordered(floatx80, floatx80, float_status *status);
621int floatx80_eq_quiet(floatx80, floatx80, float_status *status);
622int floatx80_le_quiet(floatx80, floatx80, float_status *status);
623int floatx80_lt_quiet(floatx80, floatx80, float_status *status);
624int floatx80_unordered_quiet(floatx80, floatx80, float_status *status);
625int floatx80_compare(floatx80, floatx80, float_status *status);
626int floatx80_compare_quiet(floatx80, floatx80, float_status *status);
18569871 627int floatx80_is_quiet_nan( floatx80 );
750afe93 628int floatx80_is_signaling_nan( floatx80 );
f6a7d92a 629floatx80 floatx80_maybe_silence_nan( floatx80 );
e5a41ffa 630floatx80 floatx80_scalbn(floatx80, int, float_status *status);
158142c2 631
a49db98d 632static inline floatx80 floatx80_abs(floatx80 a)
1d6bda35
FB
633{
634 a.high &= 0x7fff;
635 return a;
636}
637
a49db98d 638static inline floatx80 floatx80_chs(floatx80 a)
1d6bda35
FB
639{
640 a.high ^= 0x8000;
641 return a;
642}
643
a49db98d 644static inline int floatx80_is_infinity(floatx80 a)
c52ab6f5 645{
b76235e4 646 return (a.high & 0x7fff) == 0x7fff && a.low == 0x8000000000000000LL;
c52ab6f5
AJ
647}
648
a49db98d 649static inline int floatx80_is_neg(floatx80 a)
c52ab6f5
AJ
650{
651 return a.high >> 15;
652}
653
a49db98d 654static inline int floatx80_is_zero(floatx80 a)
c52ab6f5
AJ
655{
656 return (a.high & 0x7fff) == 0 && a.low == 0;
657}
658
a49db98d 659static inline int floatx80_is_zero_or_denormal(floatx80 a)
587eabfa
AJ
660{
661 return (a.high & 0x7fff) == 0;
662}
663
a49db98d 664static inline int floatx80_is_any_nan(floatx80 a)
2bed652f
PM
665{
666 return ((a.high & 0x7fff) == 0x7fff) && (a.low<<1);
667}
668
f3218a8d
AJ
669#define floatx80_zero make_floatx80(0x0000, 0x0000000000000000LL)
670#define floatx80_one make_floatx80(0x3fff, 0x8000000000000000LL)
671#define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
c4b4c77a 672#define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
f3218a8d
AJ
673#define floatx80_half make_floatx80(0x3ffe, 0x8000000000000000LL)
674#define floatx80_infinity make_floatx80(0x7fff, 0x8000000000000000LL)
675
8559666d 676/*----------------------------------------------------------------------------
789ec7ce 677| The pattern for a default generated extended double-precision NaN.
8559666d 678*----------------------------------------------------------------------------*/
789ec7ce 679extern const floatx80 floatx80_default_nan;
8559666d 680
158142c2
FB
681/*----------------------------------------------------------------------------
682| Software IEC/IEEE quadruple-precision conversion routines.
683*----------------------------------------------------------------------------*/
e5a41ffa
PM
684int32 float128_to_int32(float128, float_status *status);
685int32 float128_to_int32_round_to_zero(float128, float_status *status);
686int64 float128_to_int64(float128, float_status *status);
687int64 float128_to_int64_round_to_zero(float128, float_status *status);
688float32 float128_to_float32(float128, float_status *status);
689float64 float128_to_float64(float128, float_status *status);
690floatx80 float128_to_floatx80(float128, float_status *status);
158142c2
FB
691
692/*----------------------------------------------------------------------------
693| Software IEC/IEEE quadruple-precision operations.
694*----------------------------------------------------------------------------*/
e5a41ffa
PM
695float128 float128_round_to_int(float128, float_status *status);
696float128 float128_add(float128, float128, float_status *status);
697float128 float128_sub(float128, float128, float_status *status);
698float128 float128_mul(float128, float128, float_status *status);
699float128 float128_div(float128, float128, float_status *status);
700float128 float128_rem(float128, float128, float_status *status);
701float128 float128_sqrt(float128, float_status *status);
702int float128_eq(float128, float128, float_status *status);
703int float128_le(float128, float128, float_status *status);
704int float128_lt(float128, float128, float_status *status);
705int float128_unordered(float128, float128, float_status *status);
706int float128_eq_quiet(float128, float128, float_status *status);
707int float128_le_quiet(float128, float128, float_status *status);
708int float128_lt_quiet(float128, float128, float_status *status);
709int float128_unordered_quiet(float128, float128, float_status *status);
710int float128_compare(float128, float128, float_status *status);
711int float128_compare_quiet(float128, float128, float_status *status);
18569871 712int float128_is_quiet_nan( float128 );
750afe93 713int float128_is_signaling_nan( float128 );
f6a7d92a 714float128 float128_maybe_silence_nan( float128 );
e5a41ffa 715float128 float128_scalbn(float128, int, float_status *status);
158142c2 716
a49db98d 717static inline float128 float128_abs(float128 a)
1d6bda35
FB
718{
719 a.high &= 0x7fffffffffffffffLL;
720 return a;
721}
722
a49db98d 723static inline float128 float128_chs(float128 a)
1d6bda35
FB
724{
725 a.high ^= 0x8000000000000000LL;
726 return a;
727}
728
a49db98d 729static inline int float128_is_infinity(float128 a)
c52ab6f5
AJ
730{
731 return (a.high & 0x7fffffffffffffffLL) == 0x7fff000000000000LL && a.low == 0;
732}
733
a49db98d 734static inline int float128_is_neg(float128 a)
c52ab6f5
AJ
735{
736 return a.high >> 63;
737}
738
a49db98d 739static inline int float128_is_zero(float128 a)
c52ab6f5
AJ
740{
741 return (a.high & 0x7fffffffffffffffLL) == 0 && a.low == 0;
742}
743
a49db98d 744static inline int float128_is_zero_or_denormal(float128 a)
587eabfa
AJ
745{
746 return (a.high & 0x7fff000000000000LL) == 0;
747}
748
a49db98d 749static inline int float128_is_any_nan(float128 a)
2bed652f
PM
750{
751 return ((a.high >> 48) & 0x7fff) == 0x7fff &&
752 ((a.low != 0) || ((a.high & 0xffffffffffffLL) != 0));
753}
754
1e397ead
RH
755#define float128_zero make_float128(0, 0)
756
8559666d 757/*----------------------------------------------------------------------------
789ec7ce 758| The pattern for a default generated quadruple-precision NaN.
8559666d 759*----------------------------------------------------------------------------*/
789ec7ce 760extern const float128 float128_default_nan;
8559666d 761
158142c2 762#endif /* !SOFTFLOAT_H */
This page took 0.748202 seconds and 4 git commands to generate.