source: mainline/softfloat/generic/softfloat.c@ d3ca210

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d3ca210 was e6a40ac, checked in by Josef Cejka <malyzelenyhnus@…>, 20 years ago

64bit float division added.
Some bugs fixed in 64bit multiplication and adding.

  • Property mode set to 100644
File size: 5.7 KB
RevLine 
[211bd8a5]1/*
2 * Copyright (C) 2005 Josef Cejka
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include<softfloat.h>
[b5440cf]30#include<sftypes.h>
[12c6f2d]31
32#include<add.h>
33#include<sub.h>
34#include<mul.h>
35#include<div.h>
36
[b5440cf]37#include<conversion.h>
38#include<comparison.h>
39#include<other.h>
[211bd8a5]40
[b5440cf]41/* Arithmetic functions */
[e799e3a]42
43float __addsf3(float a, float b)
44{
45 float32 fa, fb;
[1266543]46 fa.f = a;
47 fb.f = b;
48 if (fa.parts.sign != fb.parts.sign) {
[b5440cf]49 if (fa.parts.sign) {
[1266543]50 fa.parts.sign = 0;
51 return subFloat32(fb, fa).f;
[b5440cf]52 };
[1266543]53 fb.parts.sign = 0;
54 return subFloat32(fa, fb).f;
[b5440cf]55 }
[1266543]56 return addFloat32(fa, fb).f;
[56a39dde]57}
[e799e3a]58
[a96c570]59double __adddf3(double a, double b)
60{
61 float64 da, db;
[1266543]62 da.d = a;
63 db.d = b;
64 if (da.parts.sign != db.parts.sign) {
[a96c570]65 if (da.parts.sign) {
[1266543]66 da.parts.sign = 0;
67 return subFloat64(db, da).d;
[a96c570]68 };
[1266543]69 db.parts.sign = 0;
70 return subFloat64(da, db).d;
[a96c570]71 }
[1266543]72 return addFloat64(da, db).d;
[a96c570]73}
74
[e799e3a]75float __subsf3(float a, float b)
76{
77 float32 fa, fb;
[1266543]78 fa.f = a;
79 fb.f = b;
80 if (fa.parts.sign != fb.parts.sign) {
81 fb.parts.sign = !fb.parts.sign;
82 return addFloat32(fa, fb).f;
[b5440cf]83 }
[1266543]84 return subFloat32(fa, fb).f;
[56a39dde]85}
[e799e3a]86
[a96c570]87double __subdf3(double a, double b)
88{
89 float64 da, db;
90 da.d = a;
91 db.d = b;
92 if (da.parts.sign != db.parts.sign) {
93 db.parts.sign = !db.parts.sign;
94 return addFloat64(da, db).d;
95 }
96 return subFloat64(da, db).d;
97}
98
[3af72dc]99float __mulsf3(float a, float b)
100{
101 float32 fa, fb;
[1266543]102 fa.f = a;
103 fb.f = b;
[3af72dc]104 return mulFloat32(fa, fb).f;
105}
106
[bff16dd]107double __muldf3(double a, double b)
108{
109 float64 da, db;
110 da.d = a;
111 db.d = b;
112 return mulFloat64(da, db).d;
113}
114
[feef1cd]115float __divsf3(float a, float b)
116{
117 float32 fa, fb;
[1266543]118 fa.f = a;
119 fb.f = b;
120 return divFloat32(fa, fb).f;
[56a39dde]121}
[feef1cd]122
[e6a40ac]123double __divdf3(double a, double b)
124{
125 float64 da, db;
126 da.d = a;
127 db.d = b;
128 return divFloat64(da, db).d;
129}
130
[e799e3a]131float __negsf2(float a)
132{
133 float32 fa;
[1266543]134 fa.f = a;
135 fa.parts.sign = !fa.parts.sign;
[e799e3a]136 return fa.f;
[56a39dde]137}
[e799e3a]138
139double __negdf2(double a)
140{
141 float64 fa;
[1266543]142 fa.d = a;
143 fa.parts.sign = !fa.parts.sign;
[7afd2aca]144 return fa.d;
[56a39dde]145}
[e799e3a]146
[b5440cf]147/* Conversion functions */
[e799e3a]148
[feef1cd]149double __extendsfdf2(float a)
150{
151 float32 fa;
152 fa.f = a;
153 return convertFloat32ToFloat64(fa).d;
[56a39dde]154}
[feef1cd]155
156float __truncdfsf2(double a)
157{
158 float64 da;
159 da.d = a;
160 return convertFloat64ToFloat32(da).f;
161}
[56a39dde]162
[b5440cf]163/* Comparison functions */
[e799e3a]164
[7e557805]165/* a<b .. -1
166 * a=b .. 0
167 * a>b .. 1
168 * */
169
[cf4a823]170int __cmpsf2(float a, float b)
[7e557805]171{
[1266543]172 float32 fa, fb;
173 fa.f = a;
174 fb.f = b;
175 if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) {
[7e557805]176 return 1; /* no special constant for unordered - maybe signaled? */
177 };
178
179
[1266543]180 if (isFloat32eq(fa, fb)) {
[7e557805]181 return 0;
182 };
183
[1266543]184 if (isFloat32lt(fa, fb)) {
[7e557805]185 return -1;
186 };
187 return 1;
188}
189
190int __unordsf2(float a, float b)
191{
[1266543]192 float32 fa, fb;
193 fa.f = a;
194 fb.f = b;
195 return ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) );
[56a39dde]196}
[7e557805]197
198/**
199 * @return zero, if neither argument is a NaN and are equal
200 * */
201int __eqsf2(float a, float b)
202{
[1266543]203 float32 fa, fb;
204 fa.f = a;
205 fb.f = b;
206 if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) {
[7e557805]207 /* TODO: sigNaNs*/
208 return 1;
209 };
[1266543]210 return isFloat32eq(fa, fb) - 1;
[56a39dde]211}
[7e557805]212
213/* strange behavior, but it was in gcc documentation */
214int __nesf2(float a, float b)
215{
[1266543]216 return __eqsf2(a, b);
[56a39dde]217}
[e649dfa]218
219/* return value >= 0 if a>=b and neither is NaN */
220int __gesf2(float a, float b)
221{
[1266543]222 float32 fa, fb;
223 fa.f = a;
224 fb.f = b;
225 if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) {
[e649dfa]226 /* TODO: sigNaNs*/
[cf4a823]227 return -1;
[e649dfa]228 };
229
[1266543]230 if (isFloat32eq(fa, fb)) {
[e649dfa]231 return 0;
232 };
233
[1266543]234 if (isFloat32gt(fa, fb)) {
[e649dfa]235 return 1;
236 };
237
238 return -1;
239}
240
241/** Return negative value, if a<b and neither is NaN*/
242int __ltsf2(float a, float b)
243{
[1266543]244 float32 fa, fb;
245 fa.f = a;
246 fb.f = b;
247 if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) {
[e649dfa]248 /* TODO: sigNaNs*/
249 return 1;
250 };
251 if (isFloat32lt(fa, fb)) {
252 return -1;
253 };
254 return 0;
255}
256
257/* return value <= 0 if a<=b and neither is NaN */
258int __lesf2(float a, float b)
259{
[1266543]260 float32 fa, fb;
261 fa.f = a;
262 fb.f = b;
263 if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) {
[e649dfa]264 /* TODO: sigNaNs*/
265 return 1;
266 };
267
[1266543]268 if (isFloat32eq(fa, fb)) {
[e649dfa]269 return 0;
270 };
271
[1266543]272 if (isFloat32lt(fa, fb)) {
[e649dfa]273 return -1;
274 };
275
276 return 1;
277}
278
279/** Return positive value, if a>b and neither is NaN*/
[cf4a823]280int __gtsf2(float a, float b)
[e649dfa]281{
[1266543]282 float32 fa, fb;
283 fa.f = a;
284 fb.f = b;
285 if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) {
[e649dfa]286 /* TODO: sigNaNs*/
[cf4a823]287 return -1;
[e649dfa]288 };
289 if (isFloat32gt(fa, fb)) {
290 return 1;
291 };
292 return 0;
293}
294
[b5440cf]295/* Other functions */
[e799e3a]296
[56a39dde]297float __powisf2(float a, int b)
298{
[1266543]299/* TODO: */
[56a39dde]300}
301
302float __mulsc3(float a, float b, float c, float d)
303{
[1266543]304/* TODO: */
[56a39dde]305}
306
307float __divsc3(float a, float b, float c, float d)
308{
[1266543]309/* TODO: */
[56a39dde]310}
311
Note: See TracBrowser for help on using the repository browser.