source: mainline/uspace/lib/softfloat/softfloat.c@ 35b8bfe

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

refactor floating point support

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