source: mainline/softfloat/generic/softfloat.c@ 56a39dde

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

Bugfixes in softfloat conversion functions.

  • Property mode set to 100644
File size: 4.8 KB
Line 
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>
30#include<sftypes.h>
31#include<arithmetic.h>
32#include<conversion.h>
33#include<comparison.h>
34#include<other.h>
35
36/* Arithmetic functions */
37
38float __addsf3(float a, float b)
39{
40 float32 fa, fb;
41 fa.f=a;
42 fb.f=b;
43 if (fa.parts.sign!=fb.parts.sign) {
44 if (fa.parts.sign) {
45 fa.parts.sign=0;
46 return subFloat32(fb,fa).f;
47 };
48 fb.parts.sign=0;
49 return subFloat32(fa,fb).f;
50 }
51 return addFloat32(fa,fb).f;
52}
53
54float __subsf3(float a, float b)
55{
56 float32 fa, fb;
57 fa.f=a;
58 fb.f=b;
59 if (fa.parts.sign!=fb.parts.sign) {
60 fb.parts.sign=!fb.parts.sign;
61 return addFloat32(fa,fb).f;
62 }
63 return subFloat32(fa,fb).f;
64}
65
66float __mulsf3(float a, float b)
67{
68 float32 fa, fb;
69 fa.f=a;
70 fb.f=b;
71 return mulFloat32(fa, fb).f;
72}
73
74float __divsf3(float a, float b)
75{
76 float32 fa, fb;
77 fa.f=a;
78 fb.f=b;
79// return divFloat32(fa, fb).f;
80}
81
82float __negsf2(float a)
83{
84 float32 fa;
85 fa.f=a;
86 fa.parts.sign=!fa.parts.sign;
87 return fa.f;
88}
89
90double __negdf2(double a)
91{
92 float64 fa;
93 fa.d=a;
94 fa.parts.sign=!fa.parts.sign;
95 return fa.d;
96}
97
98/* Conversion functions */
99
100double __extendsfdf2(float a)
101{
102 float32 fa;
103 fa.f = a;
104 return convertFloat32ToFloat64(fa).d;
105}
106
107float __truncdfsf2(double a)
108{
109 float64 da;
110 da.d = a;
111 return convertFloat64ToFloat32(da).f;
112}
113
114/* Comparison functions */
115
116/* a<b .. -1
117 * a=b .. 0
118 * a>b .. 1
119 * */
120
121int __cmpsf2(float a, float b)
122{
123 float32 fa,fb;
124 fa.f=a;
125 fb.f=b;
126 if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
127 return 1; /* no special constant for unordered - maybe signaled? */
128 };
129
130
131 if (isFloat32eq(fa,fb)) {
132 return 0;
133 };
134
135 if (isFloat32lt(fa,fb)) {
136 return -1;
137 };
138 return 1;
139}
140
141int __unordsf2(float a, float b)
142{
143 float32 fa,fb;
144 fa.f=a;
145 fb.f=b;
146 return ((isFloat32NaN(fa))||(isFloat32NaN(fb)));
147}
148
149/**
150 * @return zero, if neither argument is a NaN and are equal
151 * */
152int __eqsf2(float a, float b)
153{
154 float32 fa,fb;
155 fa.f=a;
156 fb.f=b;
157 if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
158 /* TODO: sigNaNs*/
159 return 1;
160 };
161 return isFloat32eq(fa,fb)-1;
162}
163
164/* strange behavior, but it was in gcc documentation */
165int __nesf2(float a, float b)
166{
167 return __eqsf2(a,b);
168}
169
170/* return value >= 0 if a>=b and neither is NaN */
171int __gesf2(float a, float b)
172{
173 float32 fa,fb;
174 fa.f=a;
175 fb.f=b;
176 if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
177 /* TODO: sigNaNs*/
178 return -1;
179 };
180
181 if (isFloat32eq(fa,fb)) {
182 return 0;
183 };
184
185 if (isFloat32gt(fa,fb)) {
186 return 1;
187 };
188
189 return -1;
190}
191
192/** Return negative value, if a<b and neither is NaN*/
193int __ltsf2(float a, float b)
194{
195 float32 fa,fb;
196 fa.f=a;
197 fb.f=b;
198 if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
199 /* TODO: sigNaNs*/
200 return 1;
201 };
202 if (isFloat32lt(fa, fb)) {
203 return -1;
204 };
205 return 0;
206}
207
208/* return value <= 0 if a<=b and neither is NaN */
209int __lesf2(float a, float b)
210{
211 float32 fa,fb;
212 fa.f=a;
213 fb.f=b;
214 if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
215 /* TODO: sigNaNs*/
216 return 1;
217 };
218
219 if (isFloat32eq(fa,fb)) {
220 return 0;
221 };
222
223 if (isFloat32lt(fa,fb)) {
224 return -1;
225 };
226
227 return 1;
228}
229
230/** Return positive value, if a>b and neither is NaN*/
231int __gtsf2(float a, float b)
232{
233 float32 fa,fb;
234 fa.f=a;
235 fb.f=b;
236 if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
237 /* TODO: sigNaNs*/
238 return -1;
239 };
240 if (isFloat32gt(fa, fb)) {
241 return 1;
242 };
243 return 0;
244}
245
246/* Other functions */
247
248float __powisf2(float a, int b)
249{
250//TODO:
251}
252
253float __mulsc3(float a, float b, float c, float d)
254{
255//TODO:
256}
257
258float __divsc3(float a, float b, float c, float d)
259{
260//TODO:
261}
262
Note: See TracBrowser for help on using the repository browser.