blob: d60541374a26ee10f0edbeebf28f781bc7f27345 [file] [log] [blame]
Andreas Färber8d725fa2011-03-07 01:34:04 +01001/*
2 * QEMU float support
3 *
Peter Maydell242695d2014-11-24 18:43:26 +00004 * 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
14 * will be taken to be licensed under GPL-v2-or-later unless specifically
15 * indicated otherwise. See the COPYING file in the top-level directory.
Andreas Färber8d725fa2011-03-07 01:34:04 +010016 */
17
Peter Maydell2b6fee52014-11-21 22:41:09 +000018/*
19===============================================================================
20This C header file is part of the SoftFloat IEC/IEEE Floating-point
21Arithmetic Package, Release 2a.
bellard158142c2005-03-13 16:54:06 +000022
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
Peter Maydell2b6fee52014-11-21 22:41:09 +000030is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
bellard158142c2005-03-13 16:54:06 +000031arithmetic/SoftFloat.html'.
32
Peter Maydell2b6fee52014-11-21 22:41:09 +000033THIS 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.
bellard158142c2005-03-13 16:54:06 +000038
39Derivative works are acceptable, even for commercial purposes, so long as
Peter Maydell2b6fee52014-11-21 22:41:09 +000040(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.
bellard158142c2005-03-13 16:54:06 +000043
Peter Maydell2b6fee52014-11-21 22:41:09 +000044===============================================================================
45*/
bellard158142c2005-03-13 16:54:06 +000046
Peter Maydell242695d2014-11-24 18:43:26 +000047/* 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
bellard158142c2005-03-13 16:54:06 +000082#ifndef SOFTFLOAT_H
83#define SOFTFLOAT_H
84
Juan Quintela75b5a692009-07-27 16:13:23 +020085#if defined(CONFIG_SOLARIS) && defined(CONFIG_NEEDS_LIBSUNMATH)
ths0475a5c2007-04-01 18:54:44 +000086#include <sunmath.h>
87#endif
88
bellard158142c2005-03-13 16:54:06 +000089#include <inttypes.h>
Paolo Bonzini789ec7c2011-07-28 12:10:29 +020090#include "config-host.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010091#include "qemu/osdep.h"
bellard158142c2005-03-13 16:54:06 +000092
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*----------------------------------------------------------------------------*/
bellard750afe92006-10-28 19:27:11 +0000101typedef uint8_t flag;
bellard158142c2005-03-13 16:54:06 +0000102typedef uint8_t uint8;
103typedef int8_t int8;
bellard158142c2005-03-13 16:54:06 +0000104typedef unsigned int uint32;
105typedef signed int int32;
106typedef uint64_t uint64;
107typedef int64_t int64;
108
bellard158142c2005-03-13 16:54:06 +0000109#define LIT64( a ) a##LL
bellard158142c2005-03-13 16:54:06 +0000110
bellard158142c2005-03-13 16:54:06 +0000111#define STATUS_PARAM , float_status *status
112#define STATUS(field) status->field
113#define STATUS_VAR , status
114
bellard1d6bda32005-03-13 18:52:29 +0000115/*----------------------------------------------------------------------------
116| Software IEC/IEEE floating-point ordering relations
117*----------------------------------------------------------------------------*/
118enum {
119 float_relation_less = -1,
120 float_relation_equal = 0,
121 float_relation_greater = 1,
122 float_relation_unordered = 2
123};
124
bellard158142c2005-03-13 16:54:06 +0000125/*----------------------------------------------------------------------------
126| Software IEC/IEEE floating-point types.
127*----------------------------------------------------------------------------*/
pbrookf090c9d2007-11-18 14:33:24 +0000128/* Use structures for soft-float types. This prevents accidentally mixing
129 them with native int/float types. A sufficiently clever compiler and
130 sane ABI should be able to see though these structs. However
131 x86/gcc 3.x seems to struggle a bit, so leave them disabled by default. */
132//#define USE_SOFTFLOAT_STRUCT_TYPES
133#ifdef USE_SOFTFLOAT_STRUCT_TYPES
134typedef struct {
Peter Maydellbb4d4bb2011-02-10 11:28:56 +0000135 uint16_t v;
136} float16;
137#define float16_val(x) (((float16)(x)).v)
138#define make_float16(x) __extension__ ({ float16 f16_val = {x}; f16_val; })
Peter Maydelld5138cf2011-02-10 13:59:34 +0000139#define const_float16(x) { x }
Peter Maydellbb4d4bb2011-02-10 11:28:56 +0000140typedef struct {
pbrookf090c9d2007-11-18 14:33:24 +0000141 uint32_t v;
142} float32;
143/* The cast ensures an error if the wrong type is passed. */
144#define float32_val(x) (((float32)(x)).v)
145#define make_float32(x) __extension__ ({ float32 f32_val = {x}; f32_val; })
Peter Maydelld5138cf2011-02-10 13:59:34 +0000146#define const_float32(x) { x }
pbrookf090c9d2007-11-18 14:33:24 +0000147typedef struct {
148 uint64_t v;
149} float64;
150#define float64_val(x) (((float64)(x)).v)
151#define make_float64(x) __extension__ ({ float64 f64_val = {x}; f64_val; })
Peter Maydelld5138cf2011-02-10 13:59:34 +0000152#define const_float64(x) { x }
pbrookf090c9d2007-11-18 14:33:24 +0000153#else
Peter Maydellbb4d4bb2011-02-10 11:28:56 +0000154typedef uint16_t float16;
bellard158142c2005-03-13 16:54:06 +0000155typedef uint32_t float32;
156typedef uint64_t float64;
Peter Maydellbb4d4bb2011-02-10 11:28:56 +0000157#define float16_val(x) (x)
pbrookf090c9d2007-11-18 14:33:24 +0000158#define float32_val(x) (x)
159#define float64_val(x) (x)
Peter Maydellbb4d4bb2011-02-10 11:28:56 +0000160#define make_float16(x) (x)
pbrookf090c9d2007-11-18 14:33:24 +0000161#define make_float32(x) (x)
162#define make_float64(x) (x)
Peter Maydelld5138cf2011-02-10 13:59:34 +0000163#define const_float16(x) (x)
164#define const_float32(x) (x)
165#define const_float64(x) (x)
pbrookf090c9d2007-11-18 14:33:24 +0000166#endif
bellard158142c2005-03-13 16:54:06 +0000167typedef struct {
168 uint64_t low;
169 uint16_t high;
170} floatx80;
Aurelien Jarnof3218a82011-04-20 13:04:22 +0200171#define make_floatx80(exp, mant) ((floatx80) { mant, exp })
Avi Kivity3bf7e402011-12-27 17:11:20 +0200172#define make_floatx80_init(exp, mant) { .low = mant, .high = exp }
bellard158142c2005-03-13 16:54:06 +0000173typedef struct {
Juan Quintelae2542fe2009-07-27 16:13:06 +0200174#ifdef HOST_WORDS_BIGENDIAN
bellard158142c2005-03-13 16:54:06 +0000175 uint64_t high, low;
176#else
177 uint64_t low, high;
178#endif
179} float128;
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200180#define make_float128(high_, low_) ((float128) { .high = high_, .low = low_ })
Avi Kivity3bf7e402011-12-27 17:11:20 +0200181#define make_float128_init(high_, low_) { .high = high_, .low = low_ }
bellard158142c2005-03-13 16:54:06 +0000182
183/*----------------------------------------------------------------------------
184| Software IEC/IEEE floating-point underflow tininess-detection mode.
185*----------------------------------------------------------------------------*/
186enum {
187 float_tininess_after_rounding = 0,
188 float_tininess_before_rounding = 1
189};
190
191/*----------------------------------------------------------------------------
192| Software IEC/IEEE floating-point rounding mode.
193*----------------------------------------------------------------------------*/
194enum {
195 float_round_nearest_even = 0,
196 float_round_down = 1,
197 float_round_up = 2,
Peter Maydellf9288a72014-01-07 17:19:12 +0000198 float_round_to_zero = 3,
199 float_round_ties_away = 4,
bellard158142c2005-03-13 16:54:06 +0000200};
201
202/*----------------------------------------------------------------------------
203| Software IEC/IEEE floating-point exception flags.
204*----------------------------------------------------------------------------*/
205enum {
206 float_flag_invalid = 1,
207 float_flag_divbyzero = 4,
208 float_flag_overflow = 8,
209 float_flag_underflow = 16,
Peter Maydell37d18662011-01-06 19:37:53 +0000210 float_flag_inexact = 32,
Peter Maydelle6afc872011-05-19 14:46:17 +0100211 float_flag_input_denormal = 64,
212 float_flag_output_denormal = 128
bellard158142c2005-03-13 16:54:06 +0000213};
214
215typedef struct float_status {
216 signed char float_detect_tininess;
217 signed char float_rounding_mode;
218 signed char float_exception_flags;
bellard158142c2005-03-13 16:54:06 +0000219 signed char floatx80_rounding_precision;
Peter Maydell37d18662011-01-06 19:37:53 +0000220 /* should denormalised results go to zero and set the inexact flag? */
pbrookfe76d972008-12-19 14:33:59 +0000221 flag flush_to_zero;
Peter Maydell37d18662011-01-06 19:37:53 +0000222 /* should denormalised inputs go to zero and set the input_denormal flag? */
223 flag flush_inputs_to_zero;
pbrook5c7908e2008-12-19 13:53:37 +0000224 flag default_nan_mode;
bellard158142c2005-03-13 16:54:06 +0000225} float_status;
226
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400227static inline void set_float_detect_tininess(int val STATUS_PARAM)
Peter Maydellc29aca42011-04-12 13:56:40 +0100228{
229 STATUS(float_detect_tininess) = val;
230}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400231static inline void set_float_rounding_mode(int val STATUS_PARAM)
Peter Maydell879d0962014-01-07 17:19:11 +0000232{
233 STATUS(float_rounding_mode) = val;
234}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400235static inline void set_float_exception_flags(int val STATUS_PARAM)
Peter Maydell879d0962014-01-07 17:19:11 +0000236{
237 STATUS(float_exception_flags) = val;
238}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400239static inline void set_floatx80_rounding_precision(int val STATUS_PARAM)
Peter Maydell879d0962014-01-07 17:19:11 +0000240{
241 STATUS(floatx80_rounding_precision) = val;
242}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400243static inline void set_flush_to_zero(flag val STATUS_PARAM)
pbrookfe76d972008-12-19 14:33:59 +0000244{
245 STATUS(flush_to_zero) = val;
246}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400247static inline void set_flush_inputs_to_zero(flag val STATUS_PARAM)
Peter Maydell37d18662011-01-06 19:37:53 +0000248{
249 STATUS(flush_inputs_to_zero) = val;
250}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400251static inline void set_default_nan_mode(flag val STATUS_PARAM)
pbrook5c7908e2008-12-19 13:53:37 +0000252{
253 STATUS(default_nan_mode) = val;
254}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400255static inline int get_float_detect_tininess(float_status *status)
Peter Maydell879d0962014-01-07 17:19:11 +0000256{
257 return STATUS(float_detect_tininess);
258}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400259static inline int get_float_rounding_mode(float_status *status)
Peter Maydell879d0962014-01-07 17:19:11 +0000260{
261 return STATUS(float_rounding_mode);
262}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400263static inline int get_float_exception_flags(float_status *status)
bellard1d6bda32005-03-13 18:52:29 +0000264{
265 return STATUS(float_exception_flags);
266}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400267static inline int get_floatx80_rounding_precision(float_status *status)
Peter Maydell879d0962014-01-07 17:19:11 +0000268{
269 return STATUS(floatx80_rounding_precision);
270}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400271static inline flag get_flush_to_zero(float_status *status)
Peter Maydell879d0962014-01-07 17:19:11 +0000272{
273 return STATUS(flush_to_zero);
274}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400275static inline flag get_flush_inputs_to_zero(float_status *status)
Peter Maydell879d0962014-01-07 17:19:11 +0000276{
277 return STATUS(flush_inputs_to_zero);
278}
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400279static inline flag get_default_nan_mode(float_status *status)
Peter Maydell879d0962014-01-07 17:19:11 +0000280{
281 return STATUS(default_nan_mode);
282}
bellard158142c2005-03-13 16:54:06 +0000283
284/*----------------------------------------------------------------------------
285| Routine to raise any or all of the software IEC/IEEE floating-point
286| exception flags.
287*----------------------------------------------------------------------------*/
bellardec530c82006-04-25 22:36:06 +0000288void float_raise( int8 flags STATUS_PARAM);
bellard158142c2005-03-13 16:54:06 +0000289
290/*----------------------------------------------------------------------------
Alex Bennée7baeabc2014-03-17 16:31:51 +0000291| If `a' is denormal and we are in flush-to-zero mode then set the
292| input-denormal exception and return zero. Otherwise just return the value.
293*----------------------------------------------------------------------------*/
294float32 float32_squash_input_denormal(float32 a STATUS_PARAM);
295float64 float64_squash_input_denormal(float64 a STATUS_PARAM);
296
297/*----------------------------------------------------------------------------
Peter Maydell369be8f2011-10-19 16:14:06 +0000298| Options to indicate which negations to perform in float*_muladd()
299| Using these differs from negating an input or output before calling
300| the muladd function in that this means that a NaN doesn't have its
301| sign bit inverted before it is propagated.
Peter Maydell67d43532014-02-20 10:35:50 +0000302| We also support halving the result before rounding, as a special
303| case to support the ARM fused-sqrt-step instruction FRSQRTS.
Peter Maydell369be8f2011-10-19 16:14:06 +0000304*----------------------------------------------------------------------------*/
305enum {
306 float_muladd_negate_c = 1,
307 float_muladd_negate_product = 2,
Max Filippov66176802012-09-19 04:23:50 +0400308 float_muladd_negate_result = 4,
Peter Maydell67d43532014-02-20 10:35:50 +0000309 float_muladd_halve_result = 8,
Peter Maydell369be8f2011-10-19 16:14:06 +0000310};
311
312/*----------------------------------------------------------------------------
bellard158142c2005-03-13 16:54:06 +0000313| Software IEC/IEEE integer-to-floating-point conversion routines.
314*----------------------------------------------------------------------------*/
Peter Maydellc4850f92014-01-07 17:17:49 +0000315float32 int32_to_float32(int32_t STATUS_PARAM);
316float64 int32_to_float64(int32_t STATUS_PARAM);
317float32 uint32_to_float32(uint32_t STATUS_PARAM);
318float64 uint32_to_float64(uint32_t STATUS_PARAM);
319floatx80 int32_to_floatx80(int32_t STATUS_PARAM);
320float128 int32_to_float128(int32_t STATUS_PARAM);
321float32 int64_to_float32(int64_t STATUS_PARAM);
Peter Maydellc4850f92014-01-07 17:17:49 +0000322float64 int64_to_float64(int64_t STATUS_PARAM);
Peter Maydell25cbb612014-11-24 15:47:12 +0000323float32 uint64_to_float32(uint64_t STATUS_PARAM);
324float64 uint64_to_float64(uint64_t STATUS_PARAM);
Peter Maydellc4850f92014-01-07 17:17:49 +0000325floatx80 int64_to_floatx80(int64_t STATUS_PARAM);
326float128 int64_to_float128(int64_t STATUS_PARAM);
327float128 uint64_to_float128(uint64_t STATUS_PARAM);
bellard158142c2005-03-13 16:54:06 +0000328
Peter Maydell8afbdab2014-01-07 17:17:49 +0000329/* We provide the int16 versions for symmetry of API with float-to-int */
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400330static inline float32 int16_to_float32(int16_t v STATUS_PARAM)
Peter Maydell8afbdab2014-01-07 17:17:49 +0000331{
332 return int32_to_float32(v STATUS_VAR);
333}
334
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400335static inline float32 uint16_to_float32(uint16_t v STATUS_PARAM)
Peter Maydell8afbdab2014-01-07 17:17:49 +0000336{
337 return uint32_to_float32(v STATUS_VAR);
338}
339
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400340static inline float64 int16_to_float64(int16_t v STATUS_PARAM)
Peter Maydell8afbdab2014-01-07 17:17:49 +0000341{
342 return int32_to_float64(v STATUS_VAR);
343}
344
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400345static inline float64 uint16_to_float64(uint16_t v STATUS_PARAM)
Peter Maydell8afbdab2014-01-07 17:17:49 +0000346{
347 return uint32_to_float64(v STATUS_VAR);
348}
349
bellard158142c2005-03-13 16:54:06 +0000350/*----------------------------------------------------------------------------
Paul Brook60011492009-11-19 16:45:20 +0000351| Software half-precision conversion routines.
352*----------------------------------------------------------------------------*/
Peter Maydellbb4d4bb2011-02-10 11:28:56 +0000353float16 float32_to_float16( float32, flag STATUS_PARAM );
354float32 float16_to_float32( float16, flag STATUS_PARAM );
Peter Maydell14c9a072014-01-07 17:19:12 +0000355float16 float64_to_float16(float64 a, flag ieee STATUS_PARAM);
356float64 float16_to_float64(float16 a, flag ieee STATUS_PARAM);
Peter Maydellbb4d4bb2011-02-10 11:28:56 +0000357
358/*----------------------------------------------------------------------------
359| Software half-precision operations.
360*----------------------------------------------------------------------------*/
361int float16_is_quiet_nan( float16 );
362int float16_is_signaling_nan( float16 );
363float16 float16_maybe_silence_nan( float16 );
Paul Brook60011492009-11-19 16:45:20 +0000364
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400365static inline int float16_is_any_nan(float16 a)
Max Filippov213ff4e2012-09-19 04:23:51 +0400366{
367 return ((float16_val(a) & ~0x8000) > 0x7c00);
368}
369
Paul Brook60011492009-11-19 16:45:20 +0000370/*----------------------------------------------------------------------------
Christophe Lyon85596662011-02-21 17:38:44 +0100371| The pattern for a default generated half-precision NaN.
372*----------------------------------------------------------------------------*/
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200373extern const float16 float16_default_nan;
Christophe Lyon85596662011-02-21 17:38:44 +0100374
375/*----------------------------------------------------------------------------
bellard158142c2005-03-13 16:54:06 +0000376| Software IEC/IEEE single-precision conversion routines.
377*----------------------------------------------------------------------------*/
Will Newtonf581bf52014-01-07 17:17:48 +0000378int_fast16_t float32_to_int16(float32 STATUS_PARAM);
379uint_fast16_t float32_to_uint16(float32 STATUS_PARAM);
Andreas Färber94a49d82012-04-26 00:15:56 +0200380int_fast16_t float32_to_int16_round_to_zero(float32 STATUS_PARAM);
Andreas Färber5aea4c52012-04-26 00:15:55 +0200381uint_fast16_t float32_to_uint16_round_to_zero(float32 STATUS_PARAM);
Andreas Färber87b8cc32011-03-07 01:34:05 +0100382int32 float32_to_int32( float32 STATUS_PARAM );
383int32 float32_to_int32_round_to_zero( float32 STATUS_PARAM );
384uint32 float32_to_uint32( float32 STATUS_PARAM );
385uint32 float32_to_uint32_round_to_zero( float32 STATUS_PARAM );
386int64 float32_to_int64( float32 STATUS_PARAM );
Tom Musta2f18bbf2014-01-07 17:17:50 +0000387uint64 float32_to_uint64(float32 STATUS_PARAM);
Tom Mustaa13d4482014-03-31 16:03:55 -0500388uint64 float32_to_uint64_round_to_zero(float32 STATUS_PARAM);
Andreas Färber87b8cc32011-03-07 01:34:05 +0100389int64 float32_to_int64_round_to_zero( float32 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000390float64 float32_to_float64( float32 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000391floatx80 float32_to_floatx80( float32 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000392float128 float32_to_float128( float32 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000393
394/*----------------------------------------------------------------------------
395| Software IEC/IEEE single-precision operations.
396*----------------------------------------------------------------------------*/
397float32 float32_round_to_int( float32 STATUS_PARAM );
398float32 float32_add( float32, float32 STATUS_PARAM );
399float32 float32_sub( float32, float32 STATUS_PARAM );
400float32 float32_mul( float32, float32 STATUS_PARAM );
401float32 float32_div( float32, float32 STATUS_PARAM );
402float32 float32_rem( float32, float32 STATUS_PARAM );
Peter Maydell369be8f2011-10-19 16:14:06 +0000403float32 float32_muladd(float32, float32, float32, int STATUS_PARAM);
bellard158142c2005-03-13 16:54:06 +0000404float32 float32_sqrt( float32 STATUS_PARAM );
Aurelien Jarno8229c992009-02-05 12:04:05 +0100405float32 float32_exp2( float32 STATUS_PARAM );
aurel32374dfc32009-02-05 13:42:47 +0000406float32 float32_log2( float32 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200407int float32_eq( float32, float32 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000408int float32_le( float32, float32 STATUS_PARAM );
409int float32_lt( float32, float32 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200410int float32_unordered( float32, float32 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200411int float32_eq_quiet( float32, float32 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000412int float32_le_quiet( float32, float32 STATUS_PARAM );
413int float32_lt_quiet( float32, float32 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200414int float32_unordered_quiet( float32, float32 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000415int float32_compare( float32, float32 STATUS_PARAM );
416int float32_compare_quiet( float32, float32 STATUS_PARAM );
Peter Maydell274f1b02011-03-11 08:12:25 +0000417float32 float32_min(float32, float32 STATUS_PARAM);
418float32 float32_max(float32, float32 STATUS_PARAM);
Will Newtone17ab312013-12-06 17:01:41 +0000419float32 float32_minnum(float32, float32 STATUS_PARAM);
420float32 float32_maxnum(float32, float32 STATUS_PARAM);
Leon Alrae2d31e062014-06-27 08:49:06 +0100421float32 float32_minnummag(float32, float32 STATUS_PARAM);
422float32 float32_maxnummag(float32, float32 STATUS_PARAM);
Peter Maydell18569872010-12-17 15:56:06 +0000423int float32_is_quiet_nan( float32 );
bellard750afe92006-10-28 19:27:11 +0000424int float32_is_signaling_nan( float32 );
Peter Maydellb408dbd2010-12-07 15:37:34 +0000425float32 float32_maybe_silence_nan( float32 );
pbrook9ee6e8b2007-11-11 00:04:49 +0000426float32 float32_scalbn( float32, int STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000427
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400428static inline float32 float32_abs(float32 a)
bellard1d6bda32005-03-13 18:52:29 +0000429{
Peter Maydell37d18662011-01-06 19:37:53 +0000430 /* Note that abs does *not* handle NaN specially, nor does
431 * it flush denormal inputs to zero.
432 */
pbrookf090c9d2007-11-18 14:33:24 +0000433 return make_float32(float32_val(a) & 0x7fffffff);
bellard1d6bda32005-03-13 18:52:29 +0000434}
435
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400436static inline float32 float32_chs(float32 a)
bellard1d6bda32005-03-13 18:52:29 +0000437{
Peter Maydell37d18662011-01-06 19:37:53 +0000438 /* Note that chs does *not* handle NaN specially, nor does
439 * it flush denormal inputs to zero.
440 */
pbrookf090c9d2007-11-18 14:33:24 +0000441 return make_float32(float32_val(a) ^ 0x80000000);
bellard1d6bda32005-03-13 18:52:29 +0000442}
443
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400444static inline int float32_is_infinity(float32 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000445{
aurel32dadd71a2008-12-18 22:43:16 +0000446 return (float32_val(a) & 0x7fffffff) == 0x7f800000;
aurel32c52ab6f2008-12-15 17:14:20 +0000447}
448
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400449static inline int float32_is_neg(float32 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000450{
451 return float32_val(a) >> 31;
452}
453
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400454static inline int float32_is_zero(float32 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000455{
456 return (float32_val(a) & 0x7fffffff) == 0;
457}
458
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400459static inline int float32_is_any_nan(float32 a)
Peter Maydell21d6ebd2010-12-07 15:37:34 +0000460{
461 return ((float32_val(a) & ~(1 << 31)) > 0x7f800000UL);
462}
463
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400464static inline int float32_is_zero_or_denormal(float32 a)
Peter Maydell6f3300a2011-01-14 20:39:18 +0100465{
466 return (float32_val(a) & 0x7f800000) == 0;
467}
468
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400469static inline float32 float32_set_sign(float32 a, int sign)
Christophe Lyonc30fe7d2011-02-21 17:38:45 +0100470{
471 return make_float32((float32_val(a) & 0x7fffffff) | (sign << 31));
472}
473
pbrookf090c9d2007-11-18 14:33:24 +0000474#define float32_zero make_float32(0)
aurel32196cfc82009-02-04 13:52:27 +0000475#define float32_one make_float32(0x3f800000)
Aurelien Jarno8229c992009-02-05 12:04:05 +0100476#define float32_ln2 make_float32(0x3f317218)
Aurelien Jarnoc4b4c772011-04-20 13:04:22 +0200477#define float32_pi make_float32(0x40490fdb)
Christophe Lyonc30fe7d2011-02-21 17:38:45 +0100478#define float32_half make_float32(0x3f000000)
479#define float32_infinity make_float32(0x7f800000)
pbrookf090c9d2007-11-18 14:33:24 +0000480
Christophe Lyon85596662011-02-21 17:38:44 +0100481
482/*----------------------------------------------------------------------------
483| The pattern for a default generated single-precision NaN.
484*----------------------------------------------------------------------------*/
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200485extern const float32 float32_default_nan;
Christophe Lyon85596662011-02-21 17:38:44 +0100486
bellard158142c2005-03-13 16:54:06 +0000487/*----------------------------------------------------------------------------
488| Software IEC/IEEE double-precision conversion routines.
489*----------------------------------------------------------------------------*/
Will Newtonf581bf52014-01-07 17:17:48 +0000490int_fast16_t float64_to_int16(float64 STATUS_PARAM);
491uint_fast16_t float64_to_uint16(float64 STATUS_PARAM);
Andreas Färber94a49d82012-04-26 00:15:56 +0200492int_fast16_t float64_to_int16_round_to_zero(float64 STATUS_PARAM);
Andreas Färber5aea4c52012-04-26 00:15:55 +0200493uint_fast16_t float64_to_uint16_round_to_zero(float64 STATUS_PARAM);
Andreas Färber87b8cc32011-03-07 01:34:05 +0100494int32 float64_to_int32( float64 STATUS_PARAM );
495int32 float64_to_int32_round_to_zero( float64 STATUS_PARAM );
496uint32 float64_to_uint32( float64 STATUS_PARAM );
497uint32 float64_to_uint32_round_to_zero( float64 STATUS_PARAM );
498int64 float64_to_int64( float64 STATUS_PARAM );
499int64 float64_to_int64_round_to_zero( float64 STATUS_PARAM );
500uint64 float64_to_uint64 (float64 a STATUS_PARAM);
501uint64 float64_to_uint64_round_to_zero (float64 a STATUS_PARAM);
bellard158142c2005-03-13 16:54:06 +0000502float32 float64_to_float32( float64 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000503floatx80 float64_to_floatx80( float64 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000504float128 float64_to_float128( float64 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000505
506/*----------------------------------------------------------------------------
507| Software IEC/IEEE double-precision operations.
508*----------------------------------------------------------------------------*/
509float64 float64_round_to_int( float64 STATUS_PARAM );
pbrooke6e59062006-10-22 00:18:54 +0000510float64 float64_trunc_to_int( float64 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000511float64 float64_add( float64, float64 STATUS_PARAM );
512float64 float64_sub( float64, float64 STATUS_PARAM );
513float64 float64_mul( float64, float64 STATUS_PARAM );
514float64 float64_div( float64, float64 STATUS_PARAM );
515float64 float64_rem( float64, float64 STATUS_PARAM );
Peter Maydell369be8f2011-10-19 16:14:06 +0000516float64 float64_muladd(float64, float64, float64, int STATUS_PARAM);
bellard158142c2005-03-13 16:54:06 +0000517float64 float64_sqrt( float64 STATUS_PARAM );
aurel32374dfc32009-02-05 13:42:47 +0000518float64 float64_log2( float64 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200519int float64_eq( float64, float64 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000520int float64_le( float64, float64 STATUS_PARAM );
521int float64_lt( float64, float64 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200522int float64_unordered( float64, float64 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200523int float64_eq_quiet( float64, float64 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000524int float64_le_quiet( float64, float64 STATUS_PARAM );
525int float64_lt_quiet( float64, float64 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200526int float64_unordered_quiet( float64, float64 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000527int float64_compare( float64, float64 STATUS_PARAM );
528int float64_compare_quiet( float64, float64 STATUS_PARAM );
Peter Maydell274f1b02011-03-11 08:12:25 +0000529float64 float64_min(float64, float64 STATUS_PARAM);
530float64 float64_max(float64, float64 STATUS_PARAM);
Will Newtone17ab312013-12-06 17:01:41 +0000531float64 float64_minnum(float64, float64 STATUS_PARAM);
532float64 float64_maxnum(float64, float64 STATUS_PARAM);
Leon Alrae2d31e062014-06-27 08:49:06 +0100533float64 float64_minnummag(float64, float64 STATUS_PARAM);
534float64 float64_maxnummag(float64, float64 STATUS_PARAM);
Peter Maydell18569872010-12-17 15:56:06 +0000535int float64_is_quiet_nan( float64 a );
bellard750afe92006-10-28 19:27:11 +0000536int float64_is_signaling_nan( float64 );
Peter Maydellb408dbd2010-12-07 15:37:34 +0000537float64 float64_maybe_silence_nan( float64 );
pbrook9ee6e8b2007-11-11 00:04:49 +0000538float64 float64_scalbn( float64, int STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000539
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400540static inline float64 float64_abs(float64 a)
bellard1d6bda32005-03-13 18:52:29 +0000541{
Peter Maydell37d18662011-01-06 19:37:53 +0000542 /* Note that abs does *not* handle NaN specially, nor does
543 * it flush denormal inputs to zero.
544 */
pbrookf090c9d2007-11-18 14:33:24 +0000545 return make_float64(float64_val(a) & 0x7fffffffffffffffLL);
bellard1d6bda32005-03-13 18:52:29 +0000546}
547
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400548static inline float64 float64_chs(float64 a)
bellard1d6bda32005-03-13 18:52:29 +0000549{
Peter Maydell37d18662011-01-06 19:37:53 +0000550 /* Note that chs does *not* handle NaN specially, nor does
551 * it flush denormal inputs to zero.
552 */
pbrookf090c9d2007-11-18 14:33:24 +0000553 return make_float64(float64_val(a) ^ 0x8000000000000000LL);
bellard1d6bda32005-03-13 18:52:29 +0000554}
555
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400556static inline int float64_is_infinity(float64 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000557{
558 return (float64_val(a) & 0x7fffffffffffffffLL ) == 0x7ff0000000000000LL;
559}
560
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400561static inline int float64_is_neg(float64 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000562{
563 return float64_val(a) >> 63;
564}
565
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400566static inline int float64_is_zero(float64 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000567{
568 return (float64_val(a) & 0x7fffffffffffffffLL) == 0;
569}
570
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400571static inline int float64_is_any_nan(float64 a)
Peter Maydell21d6ebd2010-12-07 15:37:34 +0000572{
573 return ((float64_val(a) & ~(1ULL << 63)) > 0x7ff0000000000000ULL);
574}
575
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400576static inline int float64_is_zero_or_denormal(float64 a)
Aurelien Jarno587eabf2011-05-15 14:09:18 +0200577{
578 return (float64_val(a) & 0x7ff0000000000000LL) == 0;
579}
580
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400581static inline float64 float64_set_sign(float64 a, int sign)
Christophe Lyonc30fe7d2011-02-21 17:38:45 +0100582{
583 return make_float64((float64_val(a) & 0x7fffffffffffffffULL)
584 | ((int64_t)sign << 63));
585}
586
pbrookf090c9d2007-11-18 14:33:24 +0000587#define float64_zero make_float64(0)
aurel32196cfc82009-02-04 13:52:27 +0000588#define float64_one make_float64(0x3ff0000000000000LL)
Aurelien Jarno8229c992009-02-05 12:04:05 +0100589#define float64_ln2 make_float64(0x3fe62e42fefa39efLL)
Aurelien Jarnoc4b4c772011-04-20 13:04:22 +0200590#define float64_pi make_float64(0x400921fb54442d18LL)
Christophe Lyonc30fe7d2011-02-21 17:38:45 +0100591#define float64_half make_float64(0x3fe0000000000000LL)
592#define float64_infinity make_float64(0x7ff0000000000000LL)
pbrookf090c9d2007-11-18 14:33:24 +0000593
Christophe Lyon85596662011-02-21 17:38:44 +0100594/*----------------------------------------------------------------------------
595| The pattern for a default generated double-precision NaN.
596*----------------------------------------------------------------------------*/
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200597extern const float64 float64_default_nan;
Christophe Lyon85596662011-02-21 17:38:44 +0100598
bellard158142c2005-03-13 16:54:06 +0000599/*----------------------------------------------------------------------------
600| Software IEC/IEEE extended double-precision conversion routines.
601*----------------------------------------------------------------------------*/
Andreas Färber87b8cc32011-03-07 01:34:05 +0100602int32 floatx80_to_int32( floatx80 STATUS_PARAM );
603int32 floatx80_to_int32_round_to_zero( floatx80 STATUS_PARAM );
604int64 floatx80_to_int64( floatx80 STATUS_PARAM );
605int64 floatx80_to_int64_round_to_zero( floatx80 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000606float32 floatx80_to_float32( floatx80 STATUS_PARAM );
607float64 floatx80_to_float64( floatx80 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000608float128 floatx80_to_float128( floatx80 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000609
610/*----------------------------------------------------------------------------
611| Software IEC/IEEE extended double-precision operations.
612*----------------------------------------------------------------------------*/
613floatx80 floatx80_round_to_int( floatx80 STATUS_PARAM );
614floatx80 floatx80_add( floatx80, floatx80 STATUS_PARAM );
615floatx80 floatx80_sub( floatx80, floatx80 STATUS_PARAM );
616floatx80 floatx80_mul( floatx80, floatx80 STATUS_PARAM );
617floatx80 floatx80_div( floatx80, floatx80 STATUS_PARAM );
618floatx80 floatx80_rem( floatx80, floatx80 STATUS_PARAM );
619floatx80 floatx80_sqrt( floatx80 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200620int floatx80_eq( floatx80, floatx80 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000621int floatx80_le( floatx80, floatx80 STATUS_PARAM );
622int floatx80_lt( floatx80, floatx80 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200623int floatx80_unordered( floatx80, floatx80 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200624int floatx80_eq_quiet( floatx80, floatx80 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000625int floatx80_le_quiet( floatx80, floatx80 STATUS_PARAM );
626int floatx80_lt_quiet( floatx80, floatx80 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200627int floatx80_unordered_quiet( floatx80, floatx80 STATUS_PARAM );
Aurelien Jarnof6714d32011-04-20 13:04:22 +0200628int floatx80_compare( floatx80, floatx80 STATUS_PARAM );
629int floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM );
Peter Maydell18569872010-12-17 15:56:06 +0000630int floatx80_is_quiet_nan( floatx80 );
bellard750afe92006-10-28 19:27:11 +0000631int floatx80_is_signaling_nan( floatx80 );
Aurelien Jarnof6a7d922011-01-06 15:38:19 +0100632floatx80 floatx80_maybe_silence_nan( floatx80 );
pbrook9ee6e8b2007-11-11 00:04:49 +0000633floatx80 floatx80_scalbn( floatx80, int STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000634
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400635static inline floatx80 floatx80_abs(floatx80 a)
bellard1d6bda32005-03-13 18:52:29 +0000636{
637 a.high &= 0x7fff;
638 return a;
639}
640
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400641static inline floatx80 floatx80_chs(floatx80 a)
bellard1d6bda32005-03-13 18:52:29 +0000642{
643 a.high ^= 0x8000;
644 return a;
645}
646
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400647static inline int floatx80_is_infinity(floatx80 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000648{
Aurelien Jarnob76235e2011-04-20 13:04:22 +0200649 return (a.high & 0x7fff) == 0x7fff && a.low == 0x8000000000000000LL;
aurel32c52ab6f2008-12-15 17:14:20 +0000650}
651
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400652static inline int floatx80_is_neg(floatx80 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000653{
654 return a.high >> 15;
655}
656
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400657static inline int floatx80_is_zero(floatx80 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000658{
659 return (a.high & 0x7fff) == 0 && a.low == 0;
660}
661
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400662static inline int floatx80_is_zero_or_denormal(floatx80 a)
Aurelien Jarno587eabf2011-05-15 14:09:18 +0200663{
664 return (a.high & 0x7fff) == 0;
665}
666
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400667static inline int floatx80_is_any_nan(floatx80 a)
Peter Maydell2bed6522011-01-06 18:34:43 +0000668{
669 return ((a.high & 0x7fff) == 0x7fff) && (a.low<<1);
670}
671
Aurelien Jarnof3218a82011-04-20 13:04:22 +0200672#define floatx80_zero make_floatx80(0x0000, 0x0000000000000000LL)
673#define floatx80_one make_floatx80(0x3fff, 0x8000000000000000LL)
674#define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
Aurelien Jarnoc4b4c772011-04-20 13:04:22 +0200675#define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
Aurelien Jarnof3218a82011-04-20 13:04:22 +0200676#define floatx80_half make_floatx80(0x3ffe, 0x8000000000000000LL)
677#define floatx80_infinity make_floatx80(0x7fff, 0x8000000000000000LL)
678
Christophe Lyon85596662011-02-21 17:38:44 +0100679/*----------------------------------------------------------------------------
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200680| The pattern for a default generated extended double-precision NaN.
Christophe Lyon85596662011-02-21 17:38:44 +0100681*----------------------------------------------------------------------------*/
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200682extern const floatx80 floatx80_default_nan;
Christophe Lyon85596662011-02-21 17:38:44 +0100683
bellard158142c2005-03-13 16:54:06 +0000684/*----------------------------------------------------------------------------
685| Software IEC/IEEE quadruple-precision conversion routines.
686*----------------------------------------------------------------------------*/
Andreas Färber87b8cc32011-03-07 01:34:05 +0100687int32 float128_to_int32( float128 STATUS_PARAM );
688int32 float128_to_int32_round_to_zero( float128 STATUS_PARAM );
689int64 float128_to_int64( float128 STATUS_PARAM );
690int64 float128_to_int64_round_to_zero( float128 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000691float32 float128_to_float32( float128 STATUS_PARAM );
692float64 float128_to_float64( float128 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000693floatx80 float128_to_floatx80( float128 STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000694
695/*----------------------------------------------------------------------------
696| Software IEC/IEEE quadruple-precision operations.
697*----------------------------------------------------------------------------*/
698float128 float128_round_to_int( float128 STATUS_PARAM );
699float128 float128_add( float128, float128 STATUS_PARAM );
700float128 float128_sub( float128, float128 STATUS_PARAM );
701float128 float128_mul( float128, float128 STATUS_PARAM );
702float128 float128_div( float128, float128 STATUS_PARAM );
703float128 float128_rem( float128, float128 STATUS_PARAM );
704float128 float128_sqrt( float128 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200705int float128_eq( float128, float128 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000706int float128_le( float128, float128 STATUS_PARAM );
707int float128_lt( float128, float128 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200708int float128_unordered( float128, float128 STATUS_PARAM );
Aurelien Jarnob6893622011-04-14 00:49:29 +0200709int float128_eq_quiet( float128, float128 STATUS_PARAM );
bellard750afe92006-10-28 19:27:11 +0000710int float128_le_quiet( float128, float128 STATUS_PARAM );
711int float128_lt_quiet( float128, float128 STATUS_PARAM );
Aurelien Jarno67b78612011-04-14 00:49:29 +0200712int float128_unordered_quiet( float128, float128 STATUS_PARAM );
blueswir11f587322007-11-25 18:40:20 +0000713int float128_compare( float128, float128 STATUS_PARAM );
714int float128_compare_quiet( float128, float128 STATUS_PARAM );
Peter Maydell18569872010-12-17 15:56:06 +0000715int float128_is_quiet_nan( float128 );
bellard750afe92006-10-28 19:27:11 +0000716int float128_is_signaling_nan( float128 );
Aurelien Jarnof6a7d922011-01-06 15:38:19 +0100717float128 float128_maybe_silence_nan( float128 );
pbrook9ee6e8b2007-11-11 00:04:49 +0000718float128 float128_scalbn( float128, int STATUS_PARAM );
bellard158142c2005-03-13 16:54:06 +0000719
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400720static inline float128 float128_abs(float128 a)
bellard1d6bda32005-03-13 18:52:29 +0000721{
722 a.high &= 0x7fffffffffffffffLL;
723 return a;
724}
725
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400726static inline float128 float128_chs(float128 a)
bellard1d6bda32005-03-13 18:52:29 +0000727{
728 a.high ^= 0x8000000000000000LL;
729 return a;
730}
731
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400732static inline int float128_is_infinity(float128 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000733{
734 return (a.high & 0x7fffffffffffffffLL) == 0x7fff000000000000LL && a.low == 0;
735}
736
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400737static inline int float128_is_neg(float128 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000738{
739 return a.high >> 63;
740}
741
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400742static inline int float128_is_zero(float128 a)
aurel32c52ab6f2008-12-15 17:14:20 +0000743{
744 return (a.high & 0x7fffffffffffffffLL) == 0 && a.low == 0;
745}
746
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400747static inline int float128_is_zero_or_denormal(float128 a)
Aurelien Jarno587eabf2011-05-15 14:09:18 +0200748{
749 return (a.high & 0x7fff000000000000LL) == 0;
750}
751
Luiz Capitulinoa49db982014-06-19 10:13:43 -0400752static inline int float128_is_any_nan(float128 a)
Peter Maydell2bed6522011-01-06 18:34:43 +0000753{
754 return ((a.high >> 48) & 0x7fff) == 0x7fff &&
755 ((a.low != 0) || ((a.high & 0xffffffffffffLL) != 0));
756}
757
Richard Henderson1e397ea2012-12-31 10:09:04 -0800758#define float128_zero make_float128(0, 0)
759
Christophe Lyon85596662011-02-21 17:38:44 +0100760/*----------------------------------------------------------------------------
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200761| The pattern for a default generated quadruple-precision NaN.
Christophe Lyon85596662011-02-21 17:38:44 +0100762*----------------------------------------------------------------------------*/
Paolo Bonzini789ec7c2011-07-28 12:10:29 +0200763extern const float128 float128_default_nan;
Christophe Lyon85596662011-02-21 17:38:44 +0100764
bellard158142c2005-03-13 16:54:06 +0000765#endif /* !SOFTFLOAT_H */