source: mainline/uspace/lib/softfloat/generic/softfloat.c@ 087c27f6

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 087c27f6 was 711e7fe5, checked in by Prutkov Alex <prutkov.alex@…>, 14 years ago

Added printf module

  • Property mode set to 100755
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.