source: mainline/uspace/lib/softfloat/generic/softfloat.c@ a69cb9a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a69cb9a 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: 16.4 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 generic
31 * @ingroup sfl
32 * @brief Architecture independent parts of FPU software emulation library.
33 * @{
34 */
35/** @file Softfloat API.
36 */
37
38#include <softfloat.h>
39#include <sftypes.h>
40
41#include <add.h>
42#include <sub.h>
43#include <mul.h>
44#include <div.h>
45
46#include <conversion.h>
47#include <comparison.h>
48#include <other.h>
49
50#include <functions.h>
51
52/* Arithmetic functions */
53
54float __addsf3(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 if (fa.parts.sign) {
61 fa.parts.sign = 0;
62 return subFloat32(fb, fa).f;
63 };
64 fb.parts.sign = 0;
65 return subFloat32(fa, fb).f;
66 }
67 return addFloat32(fa, fb).f;
68}
69
70double __adddf3(double a, double b)
71{
72 float64 da, db;
73 da.d = a;
74 db.d = b;
75 if (da.parts.sign != db.parts.sign) {
76 if (da.parts.sign) {
77 da.parts.sign = 0;
78 return subFloat64(db, da).d;
79 };
80 db.parts.sign = 0;
81 return subFloat64(da, db).d;
82 }
83 return addFloat64(da, db).d;
84}
85
86long double __addtf3(long double a, long double b)
87{
88 float128 ta, tb;
89 ta.ld = a;
90 tb.ld = b;
91 if (ta.parts.sign != tb.parts.sign) {
92 if (ta.parts.sign) {
93 ta.parts.sign = 0;
94 return subFloat128(tb, ta).ld;
95 };
96 tb.parts.sign = 0;
97 return subFloat128(ta, tb).ld;
98 }
99 return addFloat128(ta, tb).ld;
100}
101
102float __subsf3(float a, float b)
103{
104 float32 fa, fb;
105 fa.f = a;
106 fb.f = b;
107 if (fa.parts.sign != fb.parts.sign) {
108 fb.parts.sign = !fb.parts.sign;
109 return addFloat32(fa, fb).f;
110 }
111 return subFloat32(fa, fb).f;
112}
113
114double __subdf3(double a, double b)
115{
116 float64 da, db;
117 da.d = a;
118 db.d = b;
119 if (da.parts.sign != db.parts.sign) {
120 db.parts.sign = !db.parts.sign;
121 return addFloat64(da, db).d;
122 }
123 return subFloat64(da, db).d;
124}
125
126long double __subtf3(long double a, long double b)
127{
128 float128 ta, tb;
129 ta.ld = a;
130 tb.ld = b;
131 if (ta.parts.sign != tb.parts.sign) {
132 tb.parts.sign = !tb.parts.sign;
133 return addFloat128(ta, tb).ld;
134 }
135 return subFloat128(ta, tb).ld;
136}
137
138float __mulsf3(float a, float b)
139{
140 float32 fa, fb;
141 fa.f = a;
142 fb.f = b;
143 return mulFloat32(fa, fb).f;
144}
145
146double __muldf3(double a, double b)
147{
148 float64 da, db;
149 da.d = a;
150 db.d = b;
151 return mulFloat64(da, db).d;
152}
153
154long double __multf3(long double a, long double b)
155{
156 float128 ta, tb;
157 ta.ld = a;
158 tb.ld = b;
159 return mulFloat128(ta, tb).ld;
160}
161
162float __divsf3(float a, float b)
163{
164 float32 fa, fb;
165 fa.f = a;
166 fb.f = b;
167 return divFloat32(fa, fb).f;
168}
169
170double __divdf3(double a, double b)
171{
172 float64 da, db;
173 da.d = a;
174 db.d = b;
175 return divFloat64(da, db).d;
176}
177
178long double __divtf3(long double a, long double b)
179{
180 float128 ta, tb;
181 ta.ld = a;
182 tb.ld = b;
183 return divFloat128(ta, tb).ld;
184}
185
186float __negsf2(float a)
187{
188 float32 fa;
189 fa.f = a;
190 fa.parts.sign = !fa.parts.sign;
191 return fa.f;
192}
193
194double __negdf2(double a)
195{
196 float64 da;
197 da.d = a;
198 da.parts.sign = !da.parts.sign;
199 return da.d;
200}
201
202long double __negtf2(long double a)
203{
204 float128 ta;
205 ta.ld = a;
206 ta.parts.sign = !ta.parts.sign;
207 return ta.ld;
208}
209
210/* Conversion functions */
211
212double __extendsfdf2(float a)
213{
214 float32 fa;
215 fa.f = a;
216 return convertFloat32ToFloat64(fa).d;
217}
218
219long double __extendsftf2(float a)
220{
221 float32 fa;
222 fa.f = a;
223 return convertFloat32ToFloat128(fa).ld;
224}
225
226long double __extenddftf2(double a)
227{
228 float64 da;
229 da.d = a;
230 return convertFloat64ToFloat128(da).ld;
231}
232
233float __truncdfsf2(double a)
234{
235 float64 da;
236 da.d = a;
237 return convertFloat64ToFloat32(da).f;
238}
239
240float __trunctfsf2(long double a)
241{
242 float128 ta;
243 ta.ld = a;
244 return convertFloat128ToFloat32(ta).f;
245}
246
247double __trunctfdf2(long double a)
248{
249 float128 ta;
250 ta.ld = a;
251 return convertFloat128ToFloat64(ta).d;
252}
253
254int __fixsfsi(float a)
255{
256 float32 fa;
257 fa.f = a;
258
259 return float32_to_int(fa);
260}
261
262int __fixdfsi(double a)
263{
264 float64 da;
265 da.d = a;
266
267 return float64_to_int(da);
268}
269
270int __fixtfsi(long double a)
271{
272 float128 ta;
273 ta.ld = a;
274
275 return float128_to_int(ta);
276}
277
278long __fixsfdi(float a)
279{
280 float32 fa;
281 fa.f = a;
282
283 return float32_to_long(fa);
284}
285
286long __fixdfdi(double a)
287{
288 float64 da;
289 da.d = a;
290
291 return float64_to_long(da);
292}
293
294long __fixtfdi(long double a)
295{
296 float128 ta;
297 ta.ld = a;
298
299 return float128_to_long(ta);
300}
301
302long long __fixsfti(float a)
303{
304 float32 fa;
305 fa.f = a;
306
307 return float32_to_longlong(fa);
308}
309
310long long __fixdfti(double a)
311{
312 float64 da;
313 da.d = a;
314
315 return float64_to_longlong(da);
316}
317
318long long __fixtfti(long double a)
319{
320 float128 ta;
321 ta.ld = a;
322
323 return float128_to_longlong(ta);
324}
325
326unsigned int __fixunssfsi(float a)
327{
328 float32 fa;
329 fa.f = a;
330
331 return float32_to_uint(fa);
332}
333
334unsigned int __fixunsdfsi(double a)
335{
336 float64 da;
337 da.d = a;
338
339 return float64_to_uint(da);
340}
341
342unsigned int __fixunstfsi(long double a)
343{
344 float128 ta;
345 ta.ld = a;
346
347 return float128_to_uint(ta);
348}
349
350unsigned long __fixunssfdi(float a)
351{
352 float32 fa;
353 fa.f = a;
354
355 return float32_to_ulong(fa);
356}
357
358unsigned long __fixunsdfdi(double a)
359{
360 float64 da;
361 da.d = a;
362
363 return float64_to_ulong(da);
364}
365
366unsigned long __fixunstfdi(long double a)
367{
368 float128 ta;
369 ta.ld = a;
370
371 return float128_to_ulong(ta);
372}
373
374unsigned long long __fixunssfti(float a)
375{
376 float32 fa;
377 fa.f = a;
378
379 return float32_to_ulonglong(fa);
380}
381
382unsigned long long __fixunsdfti(double a)
383{
384 float64 da;
385 da.d = a;
386
387 return float64_to_ulonglong(da);
388}
389
390unsigned long long __fixunstfti(long double a)
391{
392 float128 ta;
393 ta.ld = a;
394
395 return float128_to_ulonglong(ta);
396}
397
398float __floatsisf(int i)
399{
400 float32 fa;
401
402 fa = int_to_float32(i);
403 return fa.f;
404}
405
406double __floatsidf(int i)
407{
408 float64 da;
409
410 da = int_to_float64(i);
411 return da.d;
412}
413
414long double __floatsitf(int i)
415{
416 float128 ta;
417
418 ta = int_to_float128(i);
419 return ta.ld;
420}
421
422float __floatdisf(long i)
423{
424 float32 fa;
425
426 fa = long_to_float32(i);
427 return fa.f;
428}
429
430double __floatdidf(long i)
431{
432 float64 da;
433
434 da = long_to_float64(i);
435 return da.d;
436}
437
438long double __floatditf(long i)
439{
440 float128 ta;
441
442 ta = long_to_float128(i);
443 return ta.ld;
444}
445
446float __floattisf(long long i)
447{
448 float32 fa;
449
450 fa = longlong_to_float32(i);
451 return fa.f;
452}
453
454double __floattidf(long long i)
455{
456 float64 da;
457
458 da = longlong_to_float64(i);
459 return da.d;
460}
461
462long double __floattitf(long long i)
463{
464 float128 ta;
465
466 ta = longlong_to_float128(i);
467 return ta.ld;
468}
469
470float __floatunsisf(unsigned int i)
471{
472 float32 fa;
473
474 fa = uint_to_float32(i);
475 return fa.f;
476}
477
478double __floatunsidf(unsigned int i)
479{
480 float64 da;
481
482 da = uint_to_float64(i);
483 return da.d;
484}
485
486long double __floatunsitf(unsigned int i)
487{
488 float128 ta;
489
490 ta = uint_to_float128(i);
491 return ta.ld;
492}
493
494float __floatundisf(unsigned long i)
495{
496 float32 fa;
497
498 fa = ulong_to_float32(i);
499 return fa.f;
500}
501
502double __floatundidf(unsigned long i)
503{
504 float64 da;
505
506 da = ulong_to_float64(i);
507 return da.d;
508}
509
510long double __floatunditf(unsigned long i)
511{
512 float128 ta;
513
514 ta = ulong_to_float128(i);
515 return ta.ld;
516}
517
518float __floatuntisf(unsigned long long i)
519{
520 float32 fa;
521
522 fa = ulonglong_to_float32(i);
523 return fa.f;
524}
525
526double __floatuntidf(unsigned long long i)
527{
528 float64 da;
529
530 da = ulonglong_to_float64(i);
531 return da.d;
532}
533
534long double __floatuntitf(unsigned long long i)
535{
536 float128 ta;
537
538 ta = ulonglong_to_float128(i);
539 return ta.ld;
540}
541
542/* Comparison functions */
543
544int __cmpsf2(float a, float b)
545{
546 float32 fa, fb;
547 fa.f = a;
548 fb.f = b;
549
550 if ((isFloat32NaN(fa)) || (isFloat32NaN(fb))) {
551 return 1; /* no special constant for unordered - maybe signaled? */
552 }
553
554 if (isFloat32eq(fa, fb)) {
555 return 0;
556 }
557
558 if (isFloat32lt(fa, fb)) {
559 return -1;
560 }
561
562 return 1;
563}
564
565int __cmpdf2(double a, double b)
566{
567 float64 da, db;
568 da.d = a;
569 db.d = b;
570
571 if ((isFloat64NaN(da)) || (isFloat64NaN(db))) {
572 return 1; /* no special constant for unordered - maybe signaled? */
573 }
574
575 if (isFloat64eq(da, db)) {
576 return 0;
577 }
578
579 if (isFloat64lt(da, db)) {
580 return -1;
581 }
582
583 return 1;
584}
585
586int __cmptf2(long double a, long double b)
587{
588 float128 ta, tb;
589 ta.ld = a;
590 tb.ld = b;
591
592 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
593 return 1; /* no special constant for unordered - maybe signaled? */
594 }
595
596 if (isFloat128eq(ta, tb)) {
597 return 0;
598 }
599
600 if (isFloat128lt(ta, tb)) {
601 return -1;
602 }
603
604 return 1;
605}
606
607int __unordsf2(float a, float b)
608{
609 float32 fa, fb;
610 fa.f = a;
611 fb.f = b;
612 return ((isFloat32NaN(fa)) || (isFloat32NaN(fb)));
613}
614
615int __unorddf2(double a, double b)
616{
617 float64 da, db;
618 da.d = a;
619 db.d = b;
620 return ((isFloat64NaN(da)) || (isFloat64NaN(db)));
621}
622
623int __unordtf2(long double a, long double b)
624{
625 float128 ta, tb;
626 ta.ld = a;
627 tb.ld = b;
628 return ((isFloat128NaN(ta)) || (isFloat128NaN(tb)));
629}
630
631int __eqsf2(float a, float b)
632{
633 float32 fa, fb;
634 fa.f = a;
635 fb.f = b;
636 if ((isFloat32NaN(fa)) || (isFloat32NaN(fb))) {
637 /* TODO: sigNaNs */
638 return 1;
639 }
640 return isFloat32eq(fa, fb) - 1;
641}
642
643int __eqdf2(double a, double b)
644{
645 float64 da, db;
646 da.d = a;
647 db.d = b;
648 if ((isFloat64NaN(da)) || (isFloat64NaN(db))) {
649 /* TODO: sigNaNs */
650 return 1;
651 }
652 return isFloat64eq(da, db) - 1;
653}
654
655int __eqtf2(long double a, long double b)
656{
657 float128 ta, tb;
658 ta.ld = a;
659 tb.ld = b;
660 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
661 /* TODO: sigNaNs */
662 return 1;
663 }
664 return isFloat128eq(ta, tb) - 1;
665}
666
667int __nesf2(float a, float b)
668{
669 /* strange behavior, but it was in gcc documentation */
670 return __eqsf2(a, b);
671}
672
673int __nedf2(double a, double b)
674{
675 /* strange behavior, but it was in gcc documentation */
676 return __eqdf2(a, b);
677}
678
679int __netf2(long double a, long double b)
680{
681 /* strange behavior, but it was in gcc documentation */
682 return __eqtf2(a, b);
683}
684
685int __gesf2(float a, float b)
686{
687 float32 fa, fb;
688 fa.f = a;
689 fb.f = b;
690
691 if ((isFloat32NaN(fa)) || (isFloat32NaN(fb))) {
692 /* TODO: sigNaNs */
693 return -1;
694 }
695
696 if (isFloat32eq(fa, fb)) {
697 return 0;
698 }
699
700 if (isFloat32gt(fa, fb)) {
701 return 1;
702 }
703
704 return -1;
705}
706
707int __gedf2(double a, double b)
708{
709 float64 da, db;
710 da.d = a;
711 db.d = b;
712
713 if ((isFloat64NaN(da)) || (isFloat64NaN(db))) {
714 /* TODO: sigNaNs */
715 return -1;
716 }
717
718 if (isFloat64eq(da, db)) {
719 return 0;
720 }
721
722 if (isFloat64gt(da, db)) {
723 return 1;
724 }
725
726 return -1;
727}
728
729int __getf2(long double a, long double b)
730{
731 float128 ta, tb;
732 ta.ld = a;
733 tb.ld = b;
734
735 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
736 /* TODO: sigNaNs */
737 return -1;
738 }
739
740 if (isFloat128eq(ta, tb)) {
741 return 0;
742 }
743
744 if (isFloat128gt(ta, tb)) {
745 return 1;
746 }
747
748 return -1;
749}
750
751int __ltsf2(float a, float b)
752{
753 float32 fa, fb;
754 fa.f = a;
755 fb.f = b;
756
757 if ((isFloat32NaN(fa)) || (isFloat32NaN(fb))) {
758 /* TODO: sigNaNs */
759 return 1;
760 }
761
762 if (isFloat32lt(fa, fb)) {
763 return -1;
764 }
765
766 return 0;
767}
768
769int __ltdf2(double a, double b)
770{
771 float64 da, db;
772 da.d = a;
773 db.d = b;
774
775 if ((isFloat64NaN(da)) || (isFloat64NaN(db))) {
776 /* TODO: sigNaNs */
777 return 1;
778 }
779
780 if (isFloat64lt(da, db)) {
781 return -1;
782 }
783
784 return 0;
785}
786
787int __lttf2(long double a, long double b)
788{
789 float128 ta, tb;
790 ta.ld = a;
791 tb.ld = b;
792
793 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
794 /* TODO: sigNaNs */
795 return 1;
796 }
797
798 if (isFloat128lt(ta, tb)) {
799 return -1;
800 }
801
802 return 0;
803}
804
805int __lesf2(float a, float b)
806{
807 float32 fa, fb;
808 fa.f = a;
809 fb.f = b;
810
811 if ((isFloat32NaN(fa)) || (isFloat32NaN(fb))) {
812 /* TODO: sigNaNs */
813 return 1;
814 }
815
816 if (isFloat32eq(fa, fb)) {
817 return 0;
818 }
819
820 if (isFloat32lt(fa, fb)) {
821 return -1;
822 }
823
824 return 1;
825}
826
827int __ledf2(double a, double b)
828{
829 float64 da, db;
830 da.d = a;
831 db.d = b;
832
833 if ((isFloat64NaN(da)) || (isFloat64NaN(db))) {
834 /* TODO: sigNaNs */
835 return 1;
836 }
837
838 if (isFloat64eq(da, db)) {
839 return 0;
840 }
841
842 if (isFloat64lt(da, db)) {
843 return -1;
844 }
845
846 return 1;
847}
848
849int __letf2(long double a, long double b)
850{
851 float128 ta, tb;
852 ta.ld = a;
853 tb.ld = b;
854
855 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
856 /* TODO: sigNaNs */
857 return 1;
858 }
859
860 if (isFloat128eq(ta, tb)) {
861 return 0;
862 }
863
864 if (isFloat128lt(ta, tb)) {
865 return -1;
866 }
867
868 return 1;
869}
870
871int __gtsf2(float a, float b)
872{
873 float32 fa, fb;
874 fa.f = a;
875 fb.f = b;
876
877 if ((isFloat32NaN(fa)) || (isFloat32NaN(fb))) {
878 /* TODO: sigNaNs */
879 return -1;
880 }
881
882 if (isFloat32gt(fa, fb)) {
883 return 1;
884 }
885
886 return 0;
887}
888
889int __gtdf2(double a, double b)
890{
891 float64 da, db;
892 da.d = a;
893 db.d = b;
894
895 if ((isFloat64NaN(da)) || (isFloat64NaN(db))) {
896 /* TODO: sigNaNs */
897 return -1;
898 }
899
900 if (isFloat64gt(da, db)) {
901 return 1;
902 }
903
904 return 0;
905}
906
907int __gttf2(long double a, long double b)
908{
909 float128 ta, tb;
910 ta.ld = a;
911 tb.ld = b;
912
913 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
914 /* TODO: sigNaNs */
915 return -1;
916 }
917
918 if (isFloat128gt(ta, tb)) {
919 return 1;
920 }
921
922 return 0;
923}
924
925
926
927#ifdef SPARC_SOFTFLOAT
928
929/* SPARC quadruple-precision wrappers */
930
931void _Qp_add(long double *c, long double *a, long double *b)
932{
933 *c = __addtf3(*a, *b);
934}
935
936void _Qp_sub(long double *c, long double *a, long double *b)
937{
938 *c = __subtf3(*a, *b);
939}
940
941void _Qp_mul(long double *c, long double *a, long double *b)
942{
943 *c = __multf3(*a, *b);
944}
945
946void _Qp_div(long double *c, long double *a, long double *b)
947{
948 *c = __divtf3(*a, *b);
949}
950
951void _Qp_neg(long double *c, long double *a)
952{
953 *c = __negtf2(*a);
954}
955
956void _Qp_stoq(long double *c, float a)
957{
958 *c = __extendsftf2(a);
959}
960
961void _Qp_dtoq(long double *c, double a)
962{
963 *c = __extenddftf2(a);
964}
965
966float _Qp_qtos(long double *a)
967{
968 return __trunctfsf2(*a);
969}
970
971double _Qp_qtod(long double *a)
972{
973 return __trunctfdf2(*a);
974}
975
976int _Qp_qtoi(long double *a)
977{
978 return __fixtfsi(*a);
979}
980
981unsigned int _Qp_qtoui(long double *a)
982{
983 return __fixunstfsi(*a);
984}
985
986long _Qp_qtox(long double *a)
987{
988 return __fixtfdi(*a);
989}
990
991unsigned long _Qp_qtoux(long double *a)
992{
993 return __fixunstfdi(*a);
994}
995
996void _Qp_itoq(long double *c, int a)
997{
998 *c = __floatsitf(a);
999}
1000
1001void _Qp_uitoq(long double *c, unsigned int a)
1002{
1003 *c = __floatunsitf(a);
1004}
1005
1006void _Qp_xtoq(long double *c, long a)
1007{
1008 *c = __floatditf(a);
1009}
1010
1011void _Qp_uxtoq(long double *c, unsigned long a)
1012{
1013 *c = __floatunditf(a);
1014}
1015
1016int _Qp_cmp(long double *a, long double *b)
1017{
1018 float128 ta, tb;
1019 ta.ld = *a;
1020 tb.ld = *b;
1021
1022 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
1023 return 3;
1024 }
1025
1026 if (isFloat128eq(ta, tb)) {
1027 return 0;
1028 }
1029
1030 if (isFloat128lt(ta, tb)) {
1031 return 1;
1032 }
1033
1034 return 2;
1035}
1036
1037int _Qp_cmpe(long double *a, long double *b)
1038{
1039 /* strange, but is defined this way in SPARC Compliance Definition */
1040 return _Qp_cmp(a, b);
1041}
1042
1043int _Qp_feq(long double *a, long double *b)
1044{
1045 float128 ta, tb;
1046 ta.ld = *a;
1047 tb.ld = *b;
1048
1049 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
1050 return 0;
1051 }
1052
1053 return isFloat128eq(ta, tb);
1054}
1055
1056int _Qp_fge(long double *a, long double *b)
1057{
1058 float128 ta, tb;
1059 ta.ld = *a;
1060 tb.ld = *b;
1061
1062 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
1063 return 0;
1064 }
1065
1066 return isFloat128eq(ta, tb) || isFloat128gt(ta, tb);
1067}
1068
1069int _Qp_fgt(long double *a, long double *b)
1070{
1071 float128 ta, tb;
1072 ta.ld = *a;
1073 tb.ld = *b;
1074
1075 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
1076 return 0;
1077 }
1078
1079 return isFloat128gt(ta, tb);
1080}
1081
1082int _Qp_fle(long double*a, long double *b)
1083{
1084 float128 ta, tb;
1085 ta.ld = *a;
1086 tb.ld = *b;
1087
1088 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
1089 return 0;
1090 }
1091
1092 return isFloat128eq(ta, tb) || isFloat128lt(ta, tb);
1093}
1094
1095int _Qp_flt(long double *a, long double *b)
1096{
1097 float128 ta, tb;
1098 ta.ld = *a;
1099 tb.ld = *b;
1100
1101 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
1102 return 0;
1103 }
1104
1105 return isFloat128lt(ta, tb);
1106}
1107
1108int _Qp_fne(long double *a, long double *b)
1109{
1110 float128 ta, tb;
1111 ta.ld = *a;
1112 tb.ld = *b;
1113
1114 if ((isFloat128NaN(ta)) || (isFloat128NaN(tb))) {
1115 return 1;
1116 }
1117
1118 return !isFloat128eq(ta, tb);
1119}
1120
1121#endif
1122
1123/** @}
1124 */
Note: See TracBrowser for help on using the repository browser.