1207151Smarius#ifndef TESTFLOAT_SPARC64_SOFTFLOAT_H
2207151Smarius#define	TESTFLOAT_SPARC64_SOFTFLOAT_H
3207151Smarius
4207151Smarius/*============================================================================
5207151Smarius
6207151SmariusThis C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
7207151SmariusPackage, Release 2b.
8207151Smarius
9207151SmariusWritten by John R. Hauser.  This work was made possible in part by the
10207151SmariusInternational Computer Science Institute, located at Suite 600, 1947 Center
11207151SmariusStreet, Berkeley, California 94704.  Funding was partially provided by the
12207151SmariusNational Science Foundation under grant MIP-9311980.  The original version
13207151Smariusof this code was written as part of a project to build a fixed-point vector
14207151Smariusprocessor in collaboration with the University of California at Berkeley,
15207151Smariusoverseen by Profs. Nelson Morgan and John Wawrzynek.  More information
16207151Smariusis available through the Web page `http://www.cs.berkeley.edu/~jhauser/
17207151Smariusarithmetic/SoftFloat.html'.
18207151Smarius
19207151SmariusTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort has
20207151Smariusbeen made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
21207151SmariusRESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
22207151SmariusAND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
23207151SmariusCOSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
24207151SmariusEFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
25207151SmariusINSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
26207151SmariusOTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
27207151Smarius
28207151SmariusDerivative works are acceptable, even for commercial purposes, so long as
29207151Smarius(1) the source code for the derivative work includes prominent notice that
30207151Smariusthe work is derivative, and (2) the source code includes prominent notice with
31207151Smariusthese four paragraphs for those parts of this code that are retained.
32207151Smarius
33207151Smarius=============================================================================*/
34207151Smarius
35207151Smarius/* $FreeBSD: releng/10.2/tools/test/testfloat/sparc64/softfloat.h 207151 2010-04-24 12:11:41Z marius $ */
36207151Smarius
37207151Smarius#include <machine/ieeefp.h>
38207151Smarius
39207151Smarius/*----------------------------------------------------------------------------
40207151Smarius| The macro `FLOATX80' must be defined to enable the extended double-precision
41207151Smarius| floating-point format `floatx80'.  If this macro is not defined, the
42207151Smarius| `floatx80' type will not be defined, and none of the functions that either
43207151Smarius| input or output the `floatx80' type will be defined.  The same applies to
44207151Smarius| the `FLOAT128' macro and the quadruple-precision format `float128'.
45207151Smarius*----------------------------------------------------------------------------*/
46207151Smarius#define FLOATX80
47207151Smarius#define FLOAT128
48207151Smarius
49207151Smarius/*----------------------------------------------------------------------------
50207151Smarius| Software IEC/IEEE floating-point types.
51207151Smarius*----------------------------------------------------------------------------*/
52207151Smariustypedef unsigned int float32;
53207151Smariustypedef unsigned long float64;
54207151Smarius#ifdef FLOATX80
55207151Smariustypedef struct {
56207151Smarius    unsigned short high;
57207151Smarius    unsigned long low;
58207151Smarius} floatx80;
59207151Smarius#endif
60207151Smarius#ifdef FLOAT128
61207151Smariustypedef struct {
62207151Smarius    unsigned long high, low;
63207151Smarius} float128;
64207151Smarius#endif
65207151Smarius
66207151Smarius/*----------------------------------------------------------------------------
67207151Smarius| Software IEC/IEEE floating-point underflow tininess-detection mode.
68207151Smarius*----------------------------------------------------------------------------*/
69207151Smariusextern int float_detect_tininess;
70207151Smariusenum {
71207151Smarius    float_tininess_after_rounding  = 0,
72207151Smarius    float_tininess_before_rounding = 1
73207151Smarius};
74207151Smarius
75207151Smarius/*----------------------------------------------------------------------------
76207151Smarius| Software IEC/IEEE floating-point rounding mode.
77207151Smarius*----------------------------------------------------------------------------*/
78207151Smariusextern fp_rnd_t float_rounding_mode;
79207151Smariusenum {
80207151Smarius    float_round_nearest_even = 0,
81207151Smarius    float_round_to_zero      = 1,
82207151Smarius    float_round_up           = 2,
83207151Smarius    float_round_down         = 3
84207151Smarius};
85207151Smarius
86207151Smarius/*----------------------------------------------------------------------------
87207151Smarius| Software IEC/IEEE floating-point exception flags.
88207151Smarius*----------------------------------------------------------------------------*/
89207151Smariustypedef int fp_except;
90207151Smariusextern fp_except float_exception_flags;
91207151Smariusenum {
92207151Smarius    float_flag_inexact   =  1,
93207151Smarius    float_flag_divbyzero =  2,
94207151Smarius    float_flag_underflow =  4,
95207151Smarius    float_flag_overflow  =  8,
96207151Smarius    float_flag_invalid   = 16
97207151Smarius};
98207151Smarius
99207151Smarius/*----------------------------------------------------------------------------
100207151Smarius| Routine to raise any or all of the software IEC/IEEE floating-point
101207151Smarius| exception flags.
102207151Smarius*----------------------------------------------------------------------------*/
103207151Smariusvoid float_raise( int );
104207151Smarius
105207151Smarius/*----------------------------------------------------------------------------
106207151Smarius| Software IEC/IEEE integer-to-floating-point conversion routines.
107207151Smarius*----------------------------------------------------------------------------*/
108207151Smariusfloat32 int32_to_float32( int );
109207151Smariusfloat64 int32_to_float64( int );
110207151Smarius#ifdef FLOATX80
111207151Smariusfloatx80 int32_to_floatx80( int );
112207151Smarius#endif
113207151Smarius#ifdef FLOAT128
114207151Smariusfloat128 int32_to_float128( int );
115207151Smarius#endif
116207151Smariusfloat32 int64_to_float32( long );
117207151Smariusfloat64 int64_to_float64( long );
118207151Smarius#ifdef FLOATX80
119207151Smariusfloatx80 int64_to_floatx80( long );
120207151Smarius#endif
121207151Smarius#ifdef FLOAT128
122207151Smariusfloat128 int64_to_float128( long );
123207151Smarius#endif
124207151Smarius
125207151Smarius/*----------------------------------------------------------------------------
126207151Smarius| Software IEC/IEEE single-precision conversion routines.
127207151Smarius*----------------------------------------------------------------------------*/
128207151Smariusint float32_to_int32( float32 );
129207151Smariusint float32_to_int32_round_to_zero( float32 );
130207151Smariuslong float32_to_int64( float32 );
131207151Smariuslong float32_to_int64_round_to_zero( float32 );
132207151Smariusfloat64 float32_to_float64( float32 );
133207151Smarius#ifdef FLOATX80
134207151Smariusfloatx80 float32_to_floatx80( float32 );
135207151Smarius#endif
136207151Smarius#ifdef FLOAT128
137207151Smariusfloat128 float32_to_float128( float32 );
138207151Smarius#endif
139207151Smarius
140207151Smarius/*----------------------------------------------------------------------------
141207151Smarius| Software IEC/IEEE single-precision operations.
142207151Smarius*----------------------------------------------------------------------------*/
143207151Smariusfloat32 float32_round_to_int( float32 );
144207151Smariusfloat32 float32_add( float32, float32 );
145207151Smariusfloat32 float32_sub( float32, float32 );
146207151Smariusfloat32 float32_mul( float32, float32 );
147207151Smariusfloat32 float32_div( float32, float32 );
148207151Smariusfloat32 float32_rem( float32, float32 );
149207151Smariusfloat32 float32_sqrt( float32 );
150207151Smariusint float32_eq( float32, float32 );
151207151Smariusint float32_le( float32, float32 );
152207151Smariusint float32_lt( float32, float32 );
153207151Smariusint float32_eq_signaling( float32, float32 );
154207151Smariusint float32_le_quiet( float32, float32 );
155207151Smariusint float32_lt_quiet( float32, float32 );
156207151Smariusint float32_is_signaling_nan( float32 );
157207151Smarius
158207151Smarius/*----------------------------------------------------------------------------
159207151Smarius| Software IEC/IEEE double-precision conversion routines.
160207151Smarius*----------------------------------------------------------------------------*/
161207151Smariusint float64_to_int32( float64 );
162207151Smariusint float64_to_int32_round_to_zero( float64 );
163207151Smariuslong float64_to_int64( float64 );
164207151Smariuslong float64_to_int64_round_to_zero( float64 );
165207151Smariusfloat32 float64_to_float32( float64 );
166207151Smarius#ifdef FLOATX80
167207151Smariusfloatx80 float64_to_floatx80( float64 );
168207151Smarius#endif
169207151Smarius#ifdef FLOAT128
170207151Smariusfloat128 float64_to_float128( float64 );
171207151Smarius#endif
172207151Smarius
173207151Smarius/*----------------------------------------------------------------------------
174207151Smarius| Software IEC/IEEE double-precision operations.
175207151Smarius*----------------------------------------------------------------------------*/
176207151Smariusfloat64 float64_round_to_int( float64 );
177207151Smariusfloat64 float64_add( float64, float64 );
178207151Smariusfloat64 float64_sub( float64, float64 );
179207151Smariusfloat64 float64_mul( float64, float64 );
180207151Smariusfloat64 float64_div( float64, float64 );
181207151Smariusfloat64 float64_rem( float64, float64 );
182207151Smariusfloat64 float64_sqrt( float64 );
183207151Smariusint float64_eq( float64, float64 );
184207151Smariusint float64_le( float64, float64 );
185207151Smariusint float64_lt( float64, float64 );
186207151Smariusint float64_eq_signaling( float64, float64 );
187207151Smariusint float64_le_quiet( float64, float64 );
188207151Smariusint float64_lt_quiet( float64, float64 );
189207151Smariusint float64_is_signaling_nan( float64 );
190207151Smarius
191207151Smarius#ifdef FLOATX80
192207151Smarius
193207151Smarius/*----------------------------------------------------------------------------
194207151Smarius| Software IEC/IEEE extended double-precision conversion routines.
195207151Smarius*----------------------------------------------------------------------------*/
196207151Smariusint floatx80_to_int32( floatx80 );
197207151Smariusint floatx80_to_int32_round_to_zero( floatx80 );
198207151Smariuslong floatx80_to_int64( floatx80 );
199207151Smariuslong floatx80_to_int64_round_to_zero( floatx80 );
200207151Smariusfloat32 floatx80_to_float32( floatx80 );
201207151Smariusfloat64 floatx80_to_float64( floatx80 );
202207151Smarius#ifdef FLOAT128
203207151Smariusfloat128 floatx80_to_float128( floatx80 );
204207151Smarius#endif
205207151Smarius
206207151Smarius/*----------------------------------------------------------------------------
207207151Smarius| Software IEC/IEEE extended double-precision rounding precision.  Valid
208207151Smarius| values are 32, 64, and 80.
209207151Smarius*----------------------------------------------------------------------------*/
210207151Smariusextern int floatx80_rounding_precision;
211207151Smarius
212207151Smarius/*----------------------------------------------------------------------------
213207151Smarius| Software IEC/IEEE extended double-precision operations.
214207151Smarius*----------------------------------------------------------------------------*/
215207151Smariusfloatx80 floatx80_round_to_int( floatx80 );
216207151Smariusfloatx80 floatx80_add( floatx80, floatx80 );
217207151Smariusfloatx80 floatx80_sub( floatx80, floatx80 );
218207151Smariusfloatx80 floatx80_mul( floatx80, floatx80 );
219207151Smariusfloatx80 floatx80_div( floatx80, floatx80 );
220207151Smariusfloatx80 floatx80_rem( floatx80, floatx80 );
221207151Smariusfloatx80 floatx80_sqrt( floatx80 );
222207151Smariusint floatx80_eq( floatx80, floatx80 );
223207151Smariusint floatx80_le( floatx80, floatx80 );
224207151Smariusint floatx80_lt( floatx80, floatx80 );
225207151Smariusint floatx80_eq_signaling( floatx80, floatx80 );
226207151Smariusint floatx80_le_quiet( floatx80, floatx80 );
227207151Smariusint floatx80_lt_quiet( floatx80, floatx80 );
228207151Smariusint floatx80_is_signaling_nan( floatx80 );
229207151Smarius
230207151Smarius#endif
231207151Smarius
232207151Smarius#ifdef FLOAT128
233207151Smarius
234207151Smarius/*----------------------------------------------------------------------------
235207151Smarius| Software IEC/IEEE quadruple-precision conversion routines.
236207151Smarius*----------------------------------------------------------------------------*/
237207151Smariusint float128_to_int32( float128 );
238207151Smariusint float128_to_int32_round_to_zero( float128 );
239207151Smariuslong float128_to_int64( float128 );
240207151Smariuslong float128_to_int64_round_to_zero( float128 );
241207151Smariusfloat32 float128_to_float32( float128 );
242207151Smariusfloat64 float128_to_float64( float128 );
243207151Smarius#ifdef FLOATX80
244207151Smariusfloatx80 float128_to_floatx80( float128 );
245207151Smarius#endif
246207151Smarius
247207151Smarius/*----------------------------------------------------------------------------
248207151Smarius| Software IEC/IEEE quadruple-precision operations.
249207151Smarius*----------------------------------------------------------------------------*/
250207151Smariusfloat128 float128_round_to_int( float128 );
251207151Smariusfloat128 float128_add( float128, float128 );
252207151Smariusfloat128 float128_sub( float128, float128 );
253207151Smariusfloat128 float128_mul( float128, float128 );
254207151Smariusfloat128 float128_div( float128, float128 );
255207151Smariusfloat128 float128_rem( float128, float128 );
256207151Smariusfloat128 float128_sqrt( float128 );
257207151Smariusint float128_eq( float128, float128 );
258207151Smariusint float128_le( float128, float128 );
259207151Smariusint float128_lt( float128, float128 );
260207151Smariusint float128_eq_signaling( float128, float128 );
261207151Smariusint float128_le_quiet( float128, float128 );
262207151Smariusint float128_lt_quiet( float128, float128 );
263207151Smariusint float128_is_signaling_nan( float128 );
264207151Smarius
265207151Smarius#endif
266207151Smarius
267207151Smarius#endif
268