source: mainline/uspace/lib/softfloat/generic/softfloat.c@ 20dccf3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 20dccf3 was 20dccf3, checked in by Martin Decky <martin@…>, 13 years ago

implement basic ARM EABI floating point routines

  • Property mode set to 100644
File size: 20.2 KB
RevLine 
[211bd8a5]1/*
[df4ed85]2 * Copyright (c) 2005 Josef Cejka
[c67aff2]3 * Copyright (c) 2011 Petr Koupy
[211bd8a5]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
[231a60a]30/** @addtogroup softfloat generic
31 * @ingroup sfl
[846848a6]32 * @brief Architecture independent parts of FPU software emulation library.
33 * @{
34 */
[c67aff2]35/** @file Softfloat API.
[846848a6]36 */
37
[750636a]38#include <softfloat.h>
39#include <sftypes.h>
[12c6f2d]40
[750636a]41#include <add.h>
42#include <sub.h>
43#include <mul.h>
44#include <div.h>
[12c6f2d]45
[750636a]46#include <conversion.h>
47#include <comparison.h>
48#include <other.h>
[211bd8a5]49
[b5440cf]50/* Arithmetic functions */
[e799e3a]51
52float __addsf3(float a, float b)
53{
[88d5c1e]54 float_t fa;
55 float_t fb;
56 float_t res;
57
58 fa.val = a;
59 fb.val = b;
60
61 if (fa.data.parts.sign != fb.data.parts.sign) {
62 if (fa.data.parts.sign) {
63 fa.data.parts.sign = 0;
64 res.data = sub_float(fb.data, fa.data);
65
66 return res.val;
67 }
68
69 fb.data.parts.sign = 0;
70 res.data = sub_float(fa.data, fb.data);
71
72 return res.val;
[b5440cf]73 }
[88d5c1e]74
75 res.data = add_float(fa.data, fb.data);
76 return res.val;
[56a39dde]77}
[e799e3a]78
[a96c570]79double __adddf3(double a, double b)
80{
[88d5c1e]81 double_t da;
82 double_t db;
83 double_t res;
84
85 da.val = a;
86 db.val = b;
87
88 if (da.data.parts.sign != db.data.parts.sign) {
89 if (da.data.parts.sign) {
90 da.data.parts.sign = 0;
91 res.data = sub_double(db.data, da.data);
92
93 return res.val;
94 }
95
96 db.data.parts.sign = 0;
97 res.data = sub_double(da.data, db.data);
98
99 return res.val;
[a96c570]100 }
[88d5c1e]101
102 res.data = add_double(da.data, db.data);
103 return res.val;
[a96c570]104}
105
[c67aff2]106long double __addtf3(long double a, long double b)
107{
[88d5c1e]108 long_double_t ta;
109 long_double_t tb;
110 long_double_t res;
111
112 ta.val = a;
113 tb.val = b;
114
115 if (ta.data.parts.sign != tb.data.parts.sign) {
116 if (ta.data.parts.sign) {
117 ta.data.parts.sign = 0;
118 res.data = sub_long_double(tb.data, ta.data);
119
120 return res.val;
121 }
122
123 tb.data.parts.sign = 0;
124 res.data = sub_long_double(ta.data, tb.data);
125
126 return res.val;
[c67aff2]127 }
[88d5c1e]128
129 res.data = add_long_double(ta.data, tb.data);
130 return res.val;
[c67aff2]131}
132
[e799e3a]133float __subsf3(float a, float b)
134{
[88d5c1e]135 float_t fa;
136 float_t fb;
137 float_t res;
138
139 fa.val = a;
140 fb.val = b;
141
142 if (fa.data.parts.sign != fb.data.parts.sign) {
143 fb.data.parts.sign = !fb.data.parts.sign;
144 res.data = add_float(fa.data, fb.data);
145
146 return res.val;
[b5440cf]147 }
[88d5c1e]148
149 res.data = sub_float(fa.data, fb.data);
150 return res.val;
[56a39dde]151}
[e799e3a]152
[a96c570]153double __subdf3(double a, double b)
154{
[88d5c1e]155 double_t da;
156 double_t db;
157 double_t res;
158
159 da.val = a;
160 db.val = b;
161
162 if (da.data.parts.sign != db.data.parts.sign) {
163 db.data.parts.sign = !db.data.parts.sign;
164 res.data = add_double(da.data, db.data);
165
166 return res.val;
[a96c570]167 }
[88d5c1e]168
169 res.data = sub_double(da.data, db.data);
170 return res.val;
[a96c570]171}
172
[c67aff2]173long double __subtf3(long double a, long double b)
174{
[88d5c1e]175 long_double_t ta;
176 long_double_t tb;
177 long_double_t res;
178
179 ta.val = a;
180 tb.val = b;
181
182 if (ta.data.parts.sign != tb.data.parts.sign) {
183 tb.data.parts.sign = !tb.data.parts.sign;
184 res.data = add_long_double(ta.data, tb.data);
185
186 return res.val;
[c67aff2]187 }
[88d5c1e]188
189 res.data = sub_long_double(ta.data, tb.data);
190 return res.val;
[c67aff2]191}
192
[88d5c1e]193float __mulsf3(float a, float b)
[3af72dc]194{
[88d5c1e]195 float_t fa;
196 float_t fb;
197 float_t res;
198
199 fa.val = a;
200 fb.val = b;
201
202 res.data = mul_float(fa.data, fb.data);
203 return res.val;
[3af72dc]204}
205
[88d5c1e]206double __muldf3(double a, double b)
[bff16dd]207{
[88d5c1e]208 double_t da;
209 double_t db;
210 double_t res;
211
212 da.val = a;
213 db.val = b;
214
215 res.data = mul_double(da.data, db.data);
216 return res.val;
[bff16dd]217}
218
[c67aff2]219long double __multf3(long double a, long double b)
220{
[88d5c1e]221 long_double_t ta;
222 long_double_t tb;
223 long_double_t res;
224
225 ta.val = a;
226 tb.val = b;
227
228 res.data = mul_long_double(ta.data, tb.data);
229 return res.val;
[c67aff2]230}
231
[88d5c1e]232float __divsf3(float a, float b)
[feef1cd]233{
[88d5c1e]234 float_t fa;
235 float_t fb;
236 float_t res;
237
238 fa.val = a;
239 fb.val = b;
240
241 res.data = div_float(fa.data, fb.data);
242 return res.val;
[56a39dde]243}
[feef1cd]244
[88d5c1e]245double __divdf3(double a, double b)
[e6a40ac]246{
[88d5c1e]247 double_t da;
248 double_t db;
249 double_t res;
250
251 da.val = a;
252 db.val = b;
253
254 res.data = div_double(da.data, db.data);
255 return res.val;
[e6a40ac]256}
257
[c67aff2]258long double __divtf3(long double a, long double b)
259{
[88d5c1e]260 long_double_t ta;
261 long_double_t tb;
262 long_double_t res;
263
264 ta.val = a;
265 tb.val = b;
266
267 res.data = div_long_double(ta.data, tb.data);
268 return res.val;
[c67aff2]269}
270
[e799e3a]271float __negsf2(float a)
272{
[88d5c1e]273 float_t fa;
274
275 fa.val = a;
276 fa.data.parts.sign = !fa.data.parts.sign;
277
278 return fa.val;
[56a39dde]279}
[e799e3a]280
281double __negdf2(double a)
282{
[88d5c1e]283 double_t da;
284
285 da.val = a;
286 da.data.parts.sign = !da.data.parts.sign;
287
288 return da.val;
[c67aff2]289}
290
291long double __negtf2(long double a)
292{
[88d5c1e]293 long_double_t ta;
294
295 ta.val = a;
296 ta.data.parts.sign = !ta.data.parts.sign;
297
298 return ta.val;
[56a39dde]299}
[e799e3a]300
[b5440cf]301/* Conversion functions */
[e799e3a]302
[88d5c1e]303double __extendsfdf2(float a)
[feef1cd]304{
[88d5c1e]305 float_t fa;
306 double_t res;
307
308 fa.val = a;
309 res.data = float_to_double(fa.data);
310
311 return res.val;
[56a39dde]312}
[feef1cd]313
[c67aff2]314long double __extendsftf2(float a)
315{
[88d5c1e]316 float_t fa;
317 long_double_t res;
318
319 fa.val = a;
320 res.data = float_to_long_double(fa.data);
321
322 return res.val;
[c67aff2]323}
324
325long double __extenddftf2(double a)
326{
[88d5c1e]327 double_t da;
328 long_double_t res;
329
330 da.val = a;
331 res.data = double_to_long_double(da.data);
332
333 return res.val;
[c67aff2]334}
335
[88d5c1e]336float __truncdfsf2(double a)
[feef1cd]337{
[88d5c1e]338 double_t da;
339 float_t res;
340
341 da.val = a;
342 res.data = double_to_float(da.data);
343
344 return res.val;
[feef1cd]345}
[56a39dde]346
[c67aff2]347float __trunctfsf2(long double a)
348{
[88d5c1e]349 long_double_t ta;
350 float_t res;
351
352 ta.val = a;
353 res.data = long_double_to_float(ta.data);
354
355 return res.val;
[c67aff2]356}
357
358double __trunctfdf2(long double a)
359{
[88d5c1e]360 long_double_t ta;
361 double_t res;
362
363 ta.val = a;
364 res.data = long_double_to_double(ta.data);
365
366 return res.val;
[c67aff2]367}
368
[afffa1e]369int __fixsfsi(float a)
370{
[88d5c1e]371 float_t fa;
[afffa1e]372
[88d5c1e]373 fa.val = a;
374 return float_to_int(fa.data);
[afffa1e]375}
[c67aff2]376
[afffa1e]377int __fixdfsi(double a)
378{
[88d5c1e]379 double_t da;
[a82695c]380
[88d5c1e]381 da.val = a;
382 return double_to_int(da.data);
[afffa1e]383}
[c67aff2]384
385int __fixtfsi(long double a)
386{
[88d5c1e]387 long_double_t ta;
388
389 ta.val = a;
390 return long_double_to_int(ta.data);
[c67aff2]391}
[afffa1e]392
393long __fixsfdi(float a)
394{
[88d5c1e]395 float_t fa;
[afffa1e]396
[88d5c1e]397 fa.val = a;
398 return float_to_long(fa.data);
[afffa1e]399}
[c67aff2]400
[afffa1e]401long __fixdfdi(double a)
402{
[88d5c1e]403 double_t da;
[a82695c]404
[88d5c1e]405 da.val = a;
406 return double_to_long(da.data);
[afffa1e]407}
[c67aff2]408
409long __fixtfdi(long double a)
410{
[88d5c1e]411 long_double_t ta;
412
413 ta.val = a;
414 return long_double_to_long(ta.data);
[c67aff2]415}
[afffa1e]416
417long long __fixsfti(float a)
418{
[88d5c1e]419 float_t fa;
[a82695c]420
[88d5c1e]421 fa.val = a;
422 return float_to_llong(fa.data);
[afffa1e]423}
[c67aff2]424
[afffa1e]425long long __fixdfti(double a)
426{
[88d5c1e]427 double_t da;
[a82695c]428
[88d5c1e]429 da.val = a;
430 return double_to_llong(da.data);
[afffa1e]431}
432
[c67aff2]433long long __fixtfti(long double a)
434{
[88d5c1e]435 long_double_t ta;
436
437 ta.val = a;
438 return long_double_to_llong(ta.data);
[c67aff2]439}
440
[afffa1e]441unsigned int __fixunssfsi(float a)
442{
[88d5c1e]443 float_t fa;
[afffa1e]444
[88d5c1e]445 fa.val = a;
446 return float_to_uint(fa.data);
[afffa1e]447}
[c67aff2]448
[afffa1e]449unsigned int __fixunsdfsi(double a)
450{
[88d5c1e]451 double_t da;
[a82695c]452
[88d5c1e]453 da.val = a;
454 return double_to_uint(da.data);
[afffa1e]455}
[c67aff2]456
457unsigned int __fixunstfsi(long double a)
458{
[88d5c1e]459 long_double_t ta;
460
461 ta.val = a;
462 return long_double_to_uint(ta.data);
[c67aff2]463}
[afffa1e]464
465unsigned long __fixunssfdi(float a)
466{
[88d5c1e]467 float_t fa;
[afffa1e]468
[88d5c1e]469 fa.val = a;
470 return float_to_ulong(fa.data);
[afffa1e]471}
[c67aff2]472
[afffa1e]473unsigned long __fixunsdfdi(double a)
474{
[88d5c1e]475 double_t da;
[a82695c]476
[88d5c1e]477 da.val = a;
478 return double_to_ulong(da.data);
[afffa1e]479}
[c67aff2]480
481unsigned long __fixunstfdi(long double a)
482{
[88d5c1e]483 long_double_t ta;
484
485 ta.val = a;
486 return long_double_to_ulong(ta.data);
[c67aff2]487}
[afffa1e]488
489unsigned long long __fixunssfti(float a)
490{
[88d5c1e]491 float_t fa;
[a82695c]492
[88d5c1e]493 fa.val = a;
494 return float_to_ullong(fa.data);
[afffa1e]495}
[c67aff2]496
[afffa1e]497unsigned long long __fixunsdfti(double a)
498{
[88d5c1e]499 double_t da;
[a82695c]500
[88d5c1e]501 da.val = a;
502 return double_to_ullong(da.data);
[afffa1e]503}
[c67aff2]504
505unsigned long long __fixunstfti(long double a)
506{
[88d5c1e]507 long_double_t ta;
508
509 ta.val = a;
510 return long_double_to_ullong(ta.data);
[c67aff2]511}
[afffa1e]512
513float __floatsisf(int i)
514{
[88d5c1e]515 float_t res;
[1d83419]516
[88d5c1e]517 res.data = int_to_float(i);
518 return res.val;
[afffa1e]519}
[c67aff2]520
[afffa1e]521double __floatsidf(int i)
522{
[88d5c1e]523 double_t res;
[f37d769]524
[88d5c1e]525 res.data = int_to_double(i);
526 return res.val;
[afffa1e]527}
[c67aff2]528
529long double __floatsitf(int i)
530{
[88d5c1e]531 long_double_t res;
532
533 res.data = int_to_long_double(i);
534 return res.val;
[c67aff2]535}
[afffa1e]536
537float __floatdisf(long i)
538{
[88d5c1e]539 float_t res;
[1d83419]540
[88d5c1e]541 res.data = long_to_float(i);
542 return res.val;
[afffa1e]543}
[c67aff2]544
[afffa1e]545double __floatdidf(long i)
546{
[88d5c1e]547 double_t res;
[f37d769]548
[88d5c1e]549 res.data = long_to_double(i);
550 return res.val;
[afffa1e]551}
[c67aff2]552
553long double __floatditf(long i)
554{
[88d5c1e]555 long_double_t res;
556
557 res.data = long_to_long_double(i);
558 return res.val;
[c67aff2]559}
[88d5c1e]560
[afffa1e]561float __floattisf(long long i)
562{
[88d5c1e]563 float_t res;
[1d83419]564
[88d5c1e]565 res.data = llong_to_float(i);
566 return res.val;
[afffa1e]567}
[c67aff2]568
[afffa1e]569double __floattidf(long long i)
570{
[88d5c1e]571 double_t res;
[f37d769]572
[88d5c1e]573 res.data = llong_to_double(i);
574 return res.val;
[afffa1e]575}
576
[c67aff2]577long double __floattitf(long long i)
578{
[88d5c1e]579 long_double_t res;
580
581 res.data = llong_to_long_double(i);
582 return res.val;
[c67aff2]583}
584
[afffa1e]585float __floatunsisf(unsigned int i)
586{
[88d5c1e]587 float_t res;
[1d83419]588
[88d5c1e]589 res.data = uint_to_float(i);
590 return res.val;
[afffa1e]591}
[c67aff2]592
[afffa1e]593double __floatunsidf(unsigned int i)
594{
[88d5c1e]595 double_t res;
[f37d769]596
[88d5c1e]597 res.data = uint_to_double(i);
598 return res.val;
[afffa1e]599}
[c67aff2]600
601long double __floatunsitf(unsigned int i)
602{
[88d5c1e]603 long_double_t res;
604
605 res.data = uint_to_long_double(i);
606 return res.val;
[c67aff2]607}
[afffa1e]608
609float __floatundisf(unsigned long i)
610{
[88d5c1e]611 float_t res;
[1d83419]612
[88d5c1e]613 res.data = ulong_to_float(i);
614 return res.val;
[afffa1e]615}
[c67aff2]616
[afffa1e]617double __floatundidf(unsigned long i)
618{
[88d5c1e]619 double_t res;
[f37d769]620
[88d5c1e]621 res.data = ulong_to_double(i);
622 return res.val;
[afffa1e]623}
[c67aff2]624
625long double __floatunditf(unsigned long i)
626{
[88d5c1e]627 long_double_t res;
628
629 res.data = ulong_to_long_double(i);
630 return res.val;
[c67aff2]631}
[afffa1e]632
633float __floatuntisf(unsigned long long i)
634{
[88d5c1e]635 float_t res;
[1d83419]636
[88d5c1e]637 res.data = ullong_to_float(i);
638 return res.val;
[afffa1e]639}
[c67aff2]640
[afffa1e]641double __floatuntidf(unsigned long long i)
642{
[88d5c1e]643 double_t res;
[f37d769]644
[88d5c1e]645 res.data = ullong_to_double(i);
646 return res.val;
[afffa1e]647}
648
[c67aff2]649long double __floatuntitf(unsigned long long i)
650{
[88d5c1e]651 long_double_t res;
652
653 res.data = ullong_to_long_double(i);
654 return res.val;
[c67aff2]655}
656
657/* Comparison functions */
[7e557805]658
[cf4a823]659int __cmpsf2(float a, float b)
[7e557805]660{
[88d5c1e]661 float_t fa;
662 float_t fb;
663
664 fa.val = a;
665 fb.val = b;
666
667 if ((is_float_nan(fa.data)) || (is_float_nan(fb.data))) {
668 /* no special constant for unordered - maybe signaled? */
669 return 1;
[c67aff2]670 }
[7e557805]671
[88d5c1e]672 if (is_float_eq(fa.data, fb.data))
[7e557805]673 return 0;
674
[88d5c1e]675 if (is_float_lt(fa.data, fb.data))
[7e557805]676 return -1;
[88d5c1e]677
[c67aff2]678 return 1;
679}
680
681int __cmpdf2(double a, double b)
682{
[88d5c1e]683 double_t da;
684 double_t db;
685
686 da.val = a;
687 db.val = b;
688
689 if ((is_double_nan(da.data)) || (is_double_nan(db.data))) {
690 /* no special constant for unordered - maybe signaled? */
691 return 1;
[c67aff2]692 }
[88d5c1e]693
694 if (is_double_eq(da.data, db.data))
[c67aff2]695 return 0;
[88d5c1e]696
697 if (is_double_lt(da.data, db.data))
[c67aff2]698 return -1;
[88d5c1e]699
[c67aff2]700 return 1;
701}
702
703int __cmptf2(long double a, long double b)
704{
[88d5c1e]705 long_double_t ta;
706 long_double_t tb;
707
708 ta.val = a;
709 tb.val = b;
710
711 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data))) {
712 /* no special constant for unordered - maybe signaled? */
713 return 1;
[c67aff2]714 }
[88d5c1e]715
716 if (is_long_double_eq(ta.data, tb.data))
[c67aff2]717 return 0;
[88d5c1e]718
719 if (is_long_double_lt(ta.data, tb.data))
[c67aff2]720 return -1;
[88d5c1e]721
[7e557805]722 return 1;
723}
724
[88d5c1e]725int __unordsf2(float a, float b)
[7e557805]726{
[88d5c1e]727 float_t fa;
728 float_t fb;
729
730 fa.val = a;
731 fb.val = b;
732
733 return ((is_float_nan(fa.data)) || (is_float_nan(fb.data)));
[c67aff2]734}
735
736int __unorddf2(double a, double b)
737{
[88d5c1e]738 double_t da;
739 double_t db;
740
741 da.val = a;
742 db.val = b;
743
744 return ((is_double_nan(da.data)) || (is_double_nan(db.data)));
[c67aff2]745}
746
747int __unordtf2(long double a, long double b)
748{
[88d5c1e]749 long_double_t ta;
750 long_double_t tb;
751
752 ta.val = a;
753 tb.val = b;
754
755 return ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)));
[56a39dde]756}
[7e557805]757
[88d5c1e]758int __eqsf2(float a, float b)
[7e557805]759{
[88d5c1e]760 float_t fa;
761 float_t fb;
762
763 fa.val = a;
764 fb.val = b;
765
766 if ((is_float_nan(fa.data)) || (is_float_nan(fb.data))) {
767 // TODO: sigNaNs
[7e557805]768 return 1;
[c67aff2]769 }
[88d5c1e]770
771 return is_float_eq(fa.data, fb.data) - 1;
[56a39dde]772}
[7e557805]773
[c67aff2]774int __eqdf2(double a, double b)
775{
[88d5c1e]776 double_t da;
777 double_t db;
778
779 da.val = a;
780 db.val = b;
781
782 if ((is_double_nan(da.data)) || (is_double_nan(db.data))) {
783 // TODO: sigNaNs
[c67aff2]784 return 1;
785 }
[88d5c1e]786
787 return is_double_eq(da.data, db.data) - 1;
[c67aff2]788}
789
790int __eqtf2(long double a, long double b)
791{
[88d5c1e]792 long_double_t ta;
793 long_double_t tb;
794
795 ta.val = a;
796 tb.val = b;
797
798 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data))) {
799 // TODO: sigNaNs
[c67aff2]800 return 1;
801 }
[88d5c1e]802
803 return is_long_double_eq(ta.data, tb.data) - 1;
[c67aff2]804}
805
[88d5c1e]806int __nesf2(float a, float b)
[7e557805]807{
[c67aff2]808 /* strange behavior, but it was in gcc documentation */
[1266543]809 return __eqsf2(a, b);
[56a39dde]810}
[e649dfa]811
[c67aff2]812int __nedf2(double a, double b)
813{
814 /* strange behavior, but it was in gcc documentation */
815 return __eqdf2(a, b);
816}
817
818int __netf2(long double a, long double b)
819{
820 /* strange behavior, but it was in gcc documentation */
821 return __eqtf2(a, b);
822}
823
[e649dfa]824int __gesf2(float a, float b)
825{
[88d5c1e]826 float_t fa;
827 float_t fb;
828
829 fa.val = a;
830 fb.val = b;
831
832 if ((is_float_nan(fa.data)) || (is_float_nan(fb.data))) {
833 // TODO: sigNaNs
[cf4a823]834 return -1;
[c67aff2]835 }
[e649dfa]836
[88d5c1e]837 if (is_float_eq(fa.data, fb.data))
[e649dfa]838 return 0;
839
[88d5c1e]840 if (is_float_gt(fa.data, fb.data))
[e649dfa]841 return 1;
842
843 return -1;
844}
845
[c67aff2]846int __gedf2(double a, double b)
847{
[88d5c1e]848 double_t da;
849 double_t db;
850
851 da.val = a;
852 db.val = b;
853
854 if ((is_double_nan(da.data)) || (is_double_nan(db.data))) {
855 // TODO: sigNaNs
[c67aff2]856 return -1;
857 }
[88d5c1e]858
859 if (is_double_eq(da.data, db.data))
[c67aff2]860 return 0;
[88d5c1e]861
862 if (is_double_gt(da.data, db.data))
[c67aff2]863 return 1;
[88d5c1e]864
[c67aff2]865 return -1;
866}
867
868int __getf2(long double a, long double b)
869{
[88d5c1e]870 long_double_t ta;
871 long_double_t tb;
872
873 ta.val = a;
874 tb.val = b;
875
876 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data))) {
877 // TODO: sigNaNs
[c67aff2]878 return -1;
879 }
[88d5c1e]880
881 if (is_long_double_eq(ta.data, tb.data))
[c67aff2]882 return 0;
[88d5c1e]883
884 if (is_long_double_gt(ta.data, tb.data))
[c67aff2]885 return 1;
[88d5c1e]886
[c67aff2]887 return -1;
888}
889
[e649dfa]890int __ltsf2(float a, float b)
891{
[88d5c1e]892 float_t fa;
893 float_t fb;
894
895 fa.val = a;
896 fb.val = b;
897
898 if ((is_float_nan(fa.data)) || (is_float_nan(fb.data))) {
899 // TODO: sigNaNs
[e649dfa]900 return 1;
[c67aff2]901 }
[88d5c1e]902
903 if (is_float_lt(fa.data, fb.data))
[e649dfa]904 return -1;
[88d5c1e]905
[c67aff2]906 return 0;
907}
908
909int __ltdf2(double a, double b)
910{
[88d5c1e]911 double_t da;
912 double_t db;
913
914 da.val = a;
915 db.val = b;
916
917 if ((is_double_nan(da.data)) || (is_double_nan(db.data))) {
918 // TODO: sigNaNs
[c67aff2]919 return 1;
920 }
[88d5c1e]921
922 if (is_double_lt(da.data, db.data))
[c67aff2]923 return -1;
[88d5c1e]924
[c67aff2]925 return 0;
926}
927
928int __lttf2(long double a, long double b)
929{
[88d5c1e]930 long_double_t ta;
931 long_double_t tb;
932
933 ta.val = a;
934 tb.val = b;
935
936 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data))) {
937 // TODO: sigNaNs
[c67aff2]938 return 1;
939 }
[88d5c1e]940
941 if (is_long_double_lt(ta.data, tb.data))
[c67aff2]942 return -1;
[88d5c1e]943
[e649dfa]944 return 0;
945}
946
947int __lesf2(float a, float b)
948{
[88d5c1e]949 float_t fa;
950 float_t fb;
951
952 fa.val = a;
953 fb.val = b;
954
955 if ((is_float_nan(fa.data)) || (is_float_nan(fb.data))) {
956 // TODO: sigNaNs
[e649dfa]957 return 1;
[c67aff2]958 }
[e649dfa]959
[88d5c1e]960 if (is_float_eq(fa.data, fb.data))
[e649dfa]961 return 0;
962
[88d5c1e]963 if (is_float_lt(fa.data, fb.data))
[e649dfa]964 return -1;
965
966 return 1;
967}
968
[c67aff2]969int __ledf2(double a, double b)
970{
[88d5c1e]971 double_t da;
972 double_t db;
973
974 da.val = a;
975 db.val = b;
976
977 if ((is_double_nan(da.data)) || (is_double_nan(db.data))) {
978 // TODO: sigNaNs
[c67aff2]979 return 1;
980 }
[88d5c1e]981
982 if (is_double_eq(da.data, db.data))
[c67aff2]983 return 0;
[88d5c1e]984
985 if (is_double_lt(da.data, db.data))
[c67aff2]986 return -1;
[88d5c1e]987
[c67aff2]988 return 1;
989}
990
991int __letf2(long double a, long double b)
992{
[88d5c1e]993 long_double_t ta;
994 long_double_t tb;
995
996 ta.val = a;
997 tb.val = b;
998
999 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data))) {
1000 // TODO: sigNaNs
[c67aff2]1001 return 1;
1002 }
[88d5c1e]1003
1004 if (is_long_double_eq(ta.data, tb.data))
[c67aff2]1005 return 0;
[88d5c1e]1006
1007 if (is_long_double_lt(ta.data, tb.data))
[c67aff2]1008 return -1;
[88d5c1e]1009
[c67aff2]1010 return 1;
1011}
1012
[cf4a823]1013int __gtsf2(float a, float b)
[e649dfa]1014{
[88d5c1e]1015 float_t fa;
1016 float_t fb;
1017
1018 fa.val = a;
1019 fb.val = b;
1020
1021 if ((is_float_nan(fa.data)) || (is_float_nan(fb.data))) {
1022 // TODO: sigNaNs
[cf4a823]1023 return -1;
[c67aff2]1024 }
[88d5c1e]1025
1026 if (is_float_gt(fa.data, fb.data))
[e649dfa]1027 return 1;
[88d5c1e]1028
[c67aff2]1029 return 0;
1030}
1031
1032int __gtdf2(double a, double b)
1033{
[88d5c1e]1034 double_t da;
1035 double_t db;
1036
1037 da.val = a;
1038 db.val = b;
1039
1040 if ((is_double_nan(da.data)) || (is_double_nan(db.data))) {
1041 // TODO: sigNaNs
[c67aff2]1042 return -1;
1043 }
[88d5c1e]1044
1045 if (is_double_gt(da.data, db.data))
[c67aff2]1046 return 1;
[88d5c1e]1047
[c67aff2]1048 return 0;
1049}
1050
1051int __gttf2(long double a, long double b)
1052{
[88d5c1e]1053 long_double_t ta;
1054 long_double_t tb;
1055
1056 ta.val = a;
1057 tb.val = b;
1058
1059 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data))) {
1060 // TODO: sigNaNs
[c67aff2]1061 return -1;
1062 }
[88d5c1e]1063
1064 if (is_long_double_gt(ta.data, tb.data))
[c67aff2]1065 return 1;
[88d5c1e]1066
[e649dfa]1067 return 0;
1068}
1069
[c67aff2]1070/* SPARC quadruple-precision wrappers */
1071
1072void _Qp_add(long double *c, long double *a, long double *b)
[56a39dde]1073{
[c67aff2]1074 *c = __addtf3(*a, *b);
1075}
1076
1077void _Qp_sub(long double *c, long double *a, long double *b)
1078{
1079 *c = __subtf3(*a, *b);
1080}
1081
1082void _Qp_mul(long double *c, long double *a, long double *b)
1083{
1084 *c = __multf3(*a, *b);
1085}
1086
1087void _Qp_div(long double *c, long double *a, long double *b)
1088{
1089 *c = __divtf3(*a, *b);
1090}
1091
1092void _Qp_neg(long double *c, long double *a)
1093{
1094 *c = __negtf2(*a);
1095}
1096
1097void _Qp_stoq(long double *c, float a)
1098{
1099 *c = __extendsftf2(a);
1100}
1101
1102void _Qp_dtoq(long double *c, double a)
1103{
1104 *c = __extenddftf2(a);
1105}
1106
1107float _Qp_qtos(long double *a)
1108{
1109 return __trunctfsf2(*a);
1110}
1111
1112double _Qp_qtod(long double *a)
1113{
1114 return __trunctfdf2(*a);
1115}
1116
1117int _Qp_qtoi(long double *a)
1118{
1119 return __fixtfsi(*a);
1120}
1121
1122unsigned int _Qp_qtoui(long double *a)
1123{
1124 return __fixunstfsi(*a);
1125}
1126
1127long _Qp_qtox(long double *a)
1128{
1129 return __fixtfdi(*a);
1130}
1131
1132unsigned long _Qp_qtoux(long double *a)
1133{
1134 return __fixunstfdi(*a);
1135}
1136
1137void _Qp_itoq(long double *c, int a)
1138{
1139 *c = __floatsitf(a);
1140}
1141
1142void _Qp_uitoq(long double *c, unsigned int a)
1143{
1144 *c = __floatunsitf(a);
1145}
1146
1147void _Qp_xtoq(long double *c, long a)
1148{
1149 *c = __floatditf(a);
1150}
1151
1152void _Qp_uxtoq(long double *c, unsigned long a)
1153{
1154 *c = __floatunditf(a);
1155}
1156
1157int _Qp_cmp(long double *a, long double *b)
1158{
[88d5c1e]1159 long_double_t ta;
1160 long_double_t tb;
1161
1162 ta.val = *a;
1163 tb.val = *b;
1164
1165 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)))
[c67aff2]1166 return 3;
[88d5c1e]1167
1168 if (is_long_double_eq(ta.data, tb.data))
[c67aff2]1169 return 0;
[88d5c1e]1170
1171 if (is_long_double_lt(ta.data, tb.data))
[c67aff2]1172 return 1;
[88d5c1e]1173
[c67aff2]1174 return 2;
1175}
1176
1177int _Qp_cmpe(long double *a, long double *b)
1178{
1179 /* strange, but is defined this way in SPARC Compliance Definition */
1180 return _Qp_cmp(a, b);
1181}
1182
1183int _Qp_feq(long double *a, long double *b)
1184{
[88d5c1e]1185 long_double_t ta;
1186 long_double_t tb;
1187
1188 ta.val = *a;
1189 tb.val = *b;
1190
1191 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)))
[c67aff2]1192 return 0;
[88d5c1e]1193
1194 return is_long_double_eq(ta.data, tb.data);
[c67aff2]1195}
1196
1197int _Qp_fge(long double *a, long double *b)
1198{
[88d5c1e]1199 long_double_t ta;
1200 long_double_t tb;
1201
1202 ta.val = *a;
1203 tb.val = *b;
1204
1205 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)))
[c67aff2]1206 return 0;
[88d5c1e]1207
1208 return is_long_double_eq(ta.data, tb.data) ||
1209 is_long_double_gt(ta.data, tb.data);
[c67aff2]1210}
1211
1212int _Qp_fgt(long double *a, long double *b)
1213{
[88d5c1e]1214 long_double_t ta;
1215 long_double_t tb;
1216
1217 ta.val = *a;
1218 tb.val = *b;
1219
1220 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)))
[c67aff2]1221 return 0;
[88d5c1e]1222
1223 return is_long_double_gt(ta.data, tb.data);
[c67aff2]1224}
1225
1226int _Qp_fle(long double*a, long double *b)
1227{
[88d5c1e]1228 long_double_t ta;
1229 long_double_t tb;
1230
1231 ta.val = *a;
1232 tb.val = *b;
1233
1234 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)))
[c67aff2]1235 return 0;
[88d5c1e]1236
1237 return is_long_double_eq(ta.data, tb.data) ||
1238 is_long_double_lt(ta.data, tb.data);
[c67aff2]1239}
1240
1241int _Qp_flt(long double *a, long double *b)
1242{
[88d5c1e]1243 long_double_t ta;
1244 long_double_t tb;
1245
1246 ta.val = *a;
1247 tb.val = *b;
1248
1249 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)))
[c67aff2]1250 return 0;
[88d5c1e]1251
1252 return is_long_double_lt(ta.data, tb.data);
[56a39dde]1253}
1254
[c67aff2]1255int _Qp_fne(long double *a, long double *b)
1256{
[88d5c1e]1257 long_double_t ta;
1258 long_double_t tb;
1259
1260 ta.val = *a;
1261 tb.val = *b;
1262
1263 if ((is_long_double_nan(ta.data)) || (is_long_double_nan(tb.data)))
1264 return 0;
1265
1266 return !is_long_double_eq(ta.data, tb.data);
[c67aff2]1267}
1268
[20dccf3]1269double __aeabi_i2d(int i)
1270{
1271 return __floatsidf(i);
1272}
1273
1274double __aeabi_ui2d(unsigned int i)
1275{
1276 return __floatunsidf(i);
1277}
1278
1279int __aeabi_d2iz(double a)
1280{
1281 return __fixdfsi(a);
1282}
1283
1284unsigned int __aeabi_d2uiz(double a)
1285{
1286 return __fixunsdfsi(a);
1287}
1288
1289int __aeabi_dcmpge(double a, double b)
1290{
1291 return __gedf2(a, b);
1292}
1293
1294int __aeabi_dcmpgt(double a, double b)
1295{
1296 return __gtdf2(a, b);
1297}
1298
1299int __aeabi_dcmplt(double a, double b)
1300{
1301 return __ltdf2(a, b);
1302}
1303
1304double __aeabi_dadd(double a, double b)
1305{
1306 return __adddf3(a, b);
1307}
1308
1309double __aeabi_dsub(double a, double b)
1310{
1311 return __subdf3(a, b);
1312}
1313
1314double __aeabi_dmul(double a, double b)
1315{
1316 return __muldf3(a, b);
1317}
1318
1319double __aeabi_ddiv(double a, double b)
1320{
1321 return __divdf3(a, b);
1322}
1323
[231a60a]1324/** @}
[846848a6]1325 */
Note: See TracBrowser for help on using the repository browser.