source: mainline/uspace/lib/softfloat/include/softfloat.h@ 8bcd727

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8bcd727 was c67aff2, checked in by Petr Koupy <petr.koupy@…>, 14 years ago

Quadruple-precision softfloat, coding style improvements. Details below…

Highlights:

  • completed double-precision support
  • added quadruple-precision support
  • added SPARC quadruple-precision wrappers
  • added doxygen comments
  • corrected and unified coding style

Current state of the softfloat library:

Support for single, double and quadruple precision is currently almost complete (apart from power, square root, complex multiplication and complex division) and provides the same set of features (i.e. the support for all three precisions is now aligned). In order to extend softfloat library consistently, addition of quadruple precision was done in the same spirit as already existing single and double precision written by Josef Cejka in 2006 - that is relaxed standard-compliance for corner cases while mission-critical code sections heavily inspired by the widely used softfloat library written by John R. Hauser (although I personally think it would be more appropriate for HelenOS to use something less optimized, shorter and more readable).

Most of the quadruple-precision code is just an adapted double-precision code to work on 128-bit variables. That means if there is TODO, FIXME or some defect in single or double-precision code, it is most likely also in the quadruple-precision code. Please note that quadruple-precision functions are currently not tested - it is challenging task for itself, especially when the ports that use them are either not finished (mips64) or badly supported by simulators (sparc64). To test whole softfloat library, one would probably have to either write very non-trivial native tester, or use some existing one (e.g. TestFloat from J. R. Hauser) and port it to HelenOS (or rip the softfloat library out of HelenOS and test it on a host system). At the time of writing this, the code dependent on quadruple-precision functions (on mips64 and sparc64) is just a libposix strtold() function (and its callers, most notably scanf backend).

  • Property mode set to 100644
File size: 7.3 KB
Line 
1/*
2 * Copyright (c) 2005 Josef Cejka
3 * Copyright (c) 2011 Petr Koupy
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup softfloat
31 * @{
32 */
33/** @file Softfloat API.
34 */
35
36#ifndef __SOFTFLOAT_H__
37#define __SOFTFLOAT_H__
38
39extern float __addsf3(float, float);
40extern double __adddf3(double, double);
41extern long double __addtf3(long double, long double);
42extern long double __addxf3(long double, long double);
43
44extern float __subsf3(float, float);
45extern double __subdf3(double, double);
46extern long double __subtf3(long double, long double);
47extern long double __subxf3(long double, long double);
48
49extern float __mulsf3(float, float);
50extern double __muldf3(double, double);
51extern long double __multf3(long double, long double);
52extern long double __mulxf3(long double, long double);
53
54extern float __divsf3(float, float);
55extern double __divdf3(double, double);
56extern long double __divtf3(long double, long double);
57extern long double __divxf3(long double, long double);
58
59extern float __negsf2(float);
60extern double __negdf2(double);
61extern long double __negtf2(long double);
62extern long double __negxf2(long double);
63
64extern double __extendsfdf2(float);
65extern long double __extendsftf2(float);
66extern long double __extendsfxf2(float);
67extern long double __extenddftf2(double);
68extern long double __extenddfxf2(double);
69
70extern double __truncxfdf2(long double);
71extern double __trunctfdf2(long double);
72extern float __truncxfsf2(long double);
73extern float __trunctfsf2(long double);
74extern float __truncdfsf2(double);
75
76extern int __fixsfsi(float);
77extern int __fixdfsi(double);
78extern int __fixtfsi(long double);
79extern int __fixxfsi(long double);
80
81extern long __fixsfdi(float);
82extern long __fixdfdi(double);
83extern long __fixtfdi(long double);
84extern long __fixxfdi(long double);
85
86extern long long __fixsfti(float);
87extern long long __fixdfti(double);
88extern long long __fixtfti(long double);
89extern long long __fixxfti(long double);
90
91extern unsigned int __fixunssfsi(float);
92extern unsigned int __fixunsdfsi(double);
93extern unsigned int __fixunstfsi(long double);
94extern unsigned int __fixunsxfsi(long double);
95
96extern unsigned long __fixunssfdi(float);
97extern unsigned long __fixunsdfdi(double);
98extern unsigned long __fixunstfdi(long double);
99extern unsigned long __fixunsxfdi(long double);
100
101extern unsigned long long __fixunssfti(float);
102extern unsigned long long __fixunsdfti(double);
103extern unsigned long long __fixunstfti(long double);
104extern unsigned long long __fixunsxfti(long double);
105
106extern float __floatsisf(int);
107extern double __floatsidf(int);
108extern long double __floatsitf(int);
109extern long double __floatsixf(int);
110
111extern float __floatdisf(long);
112extern double __floatdidf(long);
113extern long double __floatditf(long);
114extern long double __floatdixf(long);
115
116extern float __floattisf(long long);
117extern double __floattidf(long long);
118extern long double __floattitf(long long);
119extern long double __floattixf(long long);
120
121extern float __floatunsisf(unsigned int);
122extern double __floatunsidf(unsigned int);
123extern long double __floatunsitf(unsigned int);
124extern long double __floatunsixf(unsigned int);
125
126extern float __floatundisf(unsigned long);
127extern double __floatundidf(unsigned long);
128extern long double __floatunditf(unsigned long);
129extern long double __floatundixf(unsigned long);
130
131extern float __floatuntisf(unsigned long long);
132extern double __floatuntidf(unsigned long long);
133extern long double __floatuntitf(unsigned long long);
134extern long double __floatuntixf(unsigned long long);
135
136extern int __cmpsf2(float, float);
137extern int __cmpdf2(double, double);
138extern int __cmptf2(long double, long double);
139
140extern int __unordsf2(float, float);
141extern int __unorddf2(double, double);
142extern int __unordtf2(long double, long double);
143
144extern int __eqsf2(float, float);
145extern int __eqdf2(double, double);
146extern int __eqtf2(long double, long double);
147
148extern int __nesf2(float, float);
149extern int __nedf2(double, double);
150extern int __netf2(long double, long double);
151
152extern int __gesf2(float, float);
153extern int __gedf2(double, double);
154extern int __getf2(long double, long double);
155
156extern int __ltsf2(float, float);
157extern int __ltdf2(double, double);
158extern int __lttf2(long double, long double);
159
160extern int __lesf2(float, float);
161extern int __ledf2(double, double);
162extern int __letf2(long double, long double);
163
164extern int __gtsf2(float, float);
165extern int __gtdf2(double, double);
166extern int __gttf2(long double, long double);
167
168/* Not implemented yet */
169extern float __powisf2(float, int);
170extern double __powidf2 (double, int);
171extern long double __powitf2 (long double, int);
172extern long double __powixf2 (long double, int);
173
174
175
176/* SPARC quadruple-precision wrappers */
177
178extern void _Qp_add(long double *, long double *, long double *);
179extern void _Qp_sub(long double *, long double *, long double *);
180extern void _Qp_mul(long double *, long double *, long double *);
181extern void _Qp_div(long double *, long double *, long double *);
182extern void _Qp_neg(long double *, long double *);
183
184extern void _Qp_stoq(long double *, float);
185extern void _Qp_dtoq(long double *, double);
186extern float _Qp_qtos(long double *);
187extern double _Qp_qtod(long double *);
188
189extern int _Qp_qtoi(long double *);
190extern unsigned int _Qp_qtoui(long double *);
191extern long _Qp_qtox(long double *);
192extern unsigned long _Qp_qtoux(long double *);
193
194extern void _Qp_itoq(long double *, int);
195extern void _Qp_uitoq(long double *, unsigned int);
196extern void _Qp_xtoq(long double *, long);
197extern void _Qp_uxtoq(long double *, unsigned long);
198
199extern int _Qp_cmp(long double *, long double *);
200extern int _Qp_cmpe(long double *, long double *);
201extern int _Qp_feq(long double *, long double *);
202extern int _Qp_fge(long double *, long double *);
203extern int _Qp_fgt(long double *, long double *);
204extern int _Qp_fle(long double*, long double *);
205extern int _Qp_flt(long double *, long double *);
206extern int _Qp_fne(long double *, long double *);
207
208/* Not implemented yet */
209extern void _Qp_sqrt(long double *, long double *);
210
211#endif
212
213/** @}
214 */
Note: See TracBrowser for help on using the repository browser.