1 /* This is a software floating point library which can be used instead of
2 the floating point routines in libgcc1.c for targets without hardware
5 /* Copyright (C) 1994 Free Software Foundation, Inc.
7 This file is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file with other programs, and to distribute
15 those programs without any restriction coming from the use of this
16 file. (The General Public License restrictions do apply in other
17 respects; for example, they cover modification of the file, and
18 distribution when not linked into another program.)
20 This file is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
25 You should have received a copy of the GNU General Public License
26 along with this program; see the file COPYING. If not, write to
27 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
29 /* As a special exception, if you link this library with other files,
30 some of which are compiled with GCC, to produce an executable,
31 this library does not by itself cause the resulting executable
32 to be covered by the GNU General Public License.
33 This exception does not however invalidate any other reasons why
34 the executable file might be covered by the GNU General Public License. */
36 /* This implements IEEE 754 format arithmetic, but does not provide a
37 mechanism for setting the rounding mode, or for generating or handling
40 The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
41 Wilson, all of Cygnus Support. */
43 /* The intended way to use this file is to make two copies, add `#define FLOAT'
44 to one copy, then compile both copies and add them to libgcc.a. */
46 /* The following macros can be defined to change the behaviour of this file:
47 FLOAT: Implement a `float', aka SFmode, fp library. If this is not
48 defined, then this file implements a `double', aka DFmode, fp library.
49 FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
50 don't include float->double conversion which requires the double library.
51 This is useful only for machines which can't support doubles, e.g. some
53 CMPtype: Specify the type that floating point compares should return.
54 This defaults to SItype, aka int.
55 US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
56 US Software goFast library. If this is not defined, the entry points use
57 the same names as libgcc1.c.
58 _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
59 two integers to the FLO_union_type.
60 NO_NANS: Disable nan and infinity handling
61 SMALL_MACHINE: Useful when operations on QIs and HIs are faster
64 typedef SFtype __attribute__ ((mode (SF)));
65 typedef DFtype __attribute__ ((mode (DF)));
67 typedef int HItype __attribute__ ((mode (HI)));
68 typedef int SItype __attribute__ ((mode (SI)));
69 typedef int DItype __attribute__ ((mode (DI)));
71 /* The type of the result of a fp compare */
73 #define CMPtype SItype
76 typedef unsigned int UHItype __attribute__ ((mode (HI)));
77 typedef unsigned int USItype __attribute__ ((mode (SI)));
78 typedef unsigned int UDItype __attribute__ ((mode (DI)));
80 #define MAX_SI_INT ((SItype) ((unsigned) (~0)>>1))
81 #define MAX_USI_INT ((USItype) ~0)
90 # define GARDROUND 0x3f
91 # define GARDMASK 0x7f
96 # define EXPMAX (0xff)
97 # define QUIET_NAN 0x100000L
98 # define FRAC_NBITS 32
99 # define FRACHIGH 0x80000000L
100 # define FRACHIGH2 0xc0000000L
101 typedef USItype fractype;
102 typedef UHItype halffractype;
103 typedef SFtype FLO_type;
104 typedef SItype intfrac;
107 # define PREFIXFPDP dp
108 # define PREFIXSFDF df
110 # define GARDROUND 0x7f
111 # define GARDMASK 0xff
112 # define GARDMSB 0x80
114 # define EXPBIAS 1023
116 # define EXPMAX (0x7ff)
117 # define QUIET_NAN 0x8000000000000LL
118 # define FRAC_NBITS 64
119 # define FRACHIGH 0x8000000000000000LL
120 # define FRACHIGH2 0xc000000000000000LL
121 typedef UDItype fractype;
122 typedef USItype halffractype;
123 typedef DFtype FLO_type;
124 typedef DItype intfrac;
127 #ifdef US_SOFTWARE_GOFAST
131 # define multiply fpmul
132 # define divide fpdiv
133 # define compare fpcmp
134 # define si_to_float sitofp
135 # define float_to_si fptosi
136 # define float_to_usi fptoui
137 # define negate __negsf2
138 # define sf_to_df fptodp
139 # define dptofp dptofp
143 # define multiply dpmul
144 # define divide dpdiv
145 # define compare dpcmp
146 # define si_to_float litodp
147 # define float_to_si dptoli
148 # define float_to_usi dptoul
149 # define negate __negdf2
150 # define df_to_sf dptofp
154 # define add __addsf3
155 # define sub __subsf3
156 # define multiply __mulsf3
157 # define divide __divsf3
158 # define compare __cmpsf2
159 # define _eq_f2 __eqsf2
160 # define _ne_f2 __nesf2
161 # define _gt_f2 __gtsf2
162 # define _ge_f2 __gesf2
163 # define _lt_f2 __ltsf2
164 # define _le_f2 __lesf2
165 # define si_to_float __floatsisf
166 # define float_to_si __fixsfsi
167 # define float_to_usi __fixunssfsi
168 # define negate __negsf2
169 # define sf_to_df __extendsfdf2
171 # define add __adddf3
172 # define sub __subdf3
173 # define multiply __muldf3
174 # define divide __divdf3
175 # define compare __cmpdf2
176 # define _eq_f2 __eqdf2
177 # define _ne_f2 __nedf2
178 # define _gt_f2 __gtdf2
179 # define _ge_f2 __gedf2
180 # define _lt_f2 __ltdf2
181 # define _le_f2 __ledf2
182 # define si_to_float __floatsidf
183 # define float_to_si __fixdfsi
184 # define float_to_usi __fixunsdfsi
185 # define negate __negdf2
186 # define df_to_sf __truncdfsf2
191 #define INLINE __inline__
193 /* Preserve the sticky-bit when shifting fractions to the right. */
194 #define LSHIFT(a) { a = (a & 1) | (a >> 1); }
196 /* numeric parameters */
197 /* F_D_BITOFF is the number of bits offset between the MSB of the mantissa
198 of a float and of a double. Assumes there are only two float types.
199 (double::FRAC_BITS+double::NGARGS-(float::FRAC_BITS-float::NGARDS))
201 #define F_D_BITOFF (52+8-(23+7))
204 #define NORMAL_EXPMIN (-(EXPBIAS)+1)
205 #define IMPLICIT_1 (1LL<<(FRACBITS+NGARDS))
206 #define IMPLICIT_2 (1LL<<(FRACBITS+1+NGARDS))
242 #ifdef _DEBUG_BITFLOAT
247 #ifndef FLOAT_BIT_ORDER_MISMATCH
249 unsigned int exp:EXPBITS;
250 fractype fraction:FRACBITS;
252 fractype fraction:FRACBITS;
253 unsigned int exp:EXPBITS;
265 /* IEEE "special" number predicates */
275 static fp_number_type *
278 static fp_number_type thenan;
285 isnan ( fp_number_type * x)
287 return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
292 isinf ( fp_number_type * x)
294 return x->class == CLASS_INFINITY;
301 iszero ( fp_number_type * x)
303 return x->class == CLASS_ZERO;
308 flip_sign ( fp_number_type * x)
314 pack_d ( fp_number_type * src)
317 fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
319 dst.bits.sign = src->sign;
323 dst.bits.exp = EXPMAX;
324 dst.bits.fraction = src->fraction.ll;
325 if (src->class == CLASS_QNAN || 1)
327 dst.bits.fraction |= QUIET_NAN;
330 else if (isinf (src))
332 dst.bits.exp = EXPMAX;
333 dst.bits.fraction = 0;
335 else if (iszero (src))
338 dst.bits.fraction = 0;
340 else if (fraction == 0)
346 if (src->normal_exp < NORMAL_EXPMIN)
348 /* This number's exponent is too low to fit into the bits
349 available in the number, so we'll store 0 in the exponent and
350 shift the fraction to the right to make up for it. */
352 int shift = NORMAL_EXPMIN - src->normal_exp;
356 if (shift > FRAC_NBITS - NGARDS)
358 /* No point shifting, since it's more that 64 out. */
363 /* Shift by the value */
367 dst.bits.fraction = fraction;
369 else if (src->normal_exp > EXPBIAS)
371 dst.bits.exp = EXPMAX;
372 dst.bits.fraction = 0;
376 dst.bits.exp = src->normal_exp + EXPBIAS;
377 /* IF the gard bits are the all zero, but the first, then we're
378 half way between two numbers, choose the one which makes the
379 lsb of the answer 0. */
380 if ((fraction & GARDMASK) == GARDMSB)
382 if (fraction & (1 << NGARDS))
383 fraction += GARDROUND + 1;
387 /* Add a one to the guards to round up */
388 fraction += GARDROUND;
390 if (fraction >= IMPLICIT_2)
396 dst.bits.fraction = fraction;
403 unpack_d (FLO_union_type * src, fp_number_type * dst)
405 fractype fraction = src->bits.fraction;
407 dst->sign = src->bits.sign;
408 if (src->bits.exp == 0)
410 /* Hmm. Looks like 0 */
413 /* tastes like zero */
414 dst->class = CLASS_ZERO;
418 /* Zero exponent with non zero fraction - it's denormalized,
419 so there isn't a leading implicit one - we'll shift it so
421 dst->normal_exp = src->bits.exp - EXPBIAS + 1;
424 dst->class = CLASS_NUMBER;
426 while (fraction < IMPLICIT_1)
432 dst->fraction.ll = fraction;
435 else if (src->bits.exp == EXPMAX)
440 /* Attatched to a zero fraction - means infinity */
441 dst->class = CLASS_INFINITY;
445 /* Non zero fraction, means nan */
448 dst->class = CLASS_SNAN;
452 dst->class = CLASS_QNAN;
454 /* Keep the fraction part as the nan number */
455 dst->fraction.ll = fraction;
460 /* Nothing strange about this number */
461 dst->normal_exp = src->bits.exp - EXPBIAS;
462 dst->class = CLASS_NUMBER;
463 dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
467 static fp_number_type *
468 _fpadd_parts (fp_number_type * a,
470 fp_number_type * tmp)
474 /* Put commonly used fields in local variables. */
505 /* Got two numbers. shift the smaller and increment the exponent till
510 a_normal_exp = a->normal_exp;
511 b_normal_exp = b->normal_exp;
512 a_fraction = a->fraction.ll;
513 b_fraction = b->fraction.ll;
515 diff = a_normal_exp - b_normal_exp;
519 if (diff < FRAC_NBITS)
521 /* ??? This does shifts one bit at a time. Optimize. */
522 while (a_normal_exp > b_normal_exp)
527 while (b_normal_exp > a_normal_exp)
535 /* Somethings's up.. choose the biggest */
536 if (a_normal_exp > b_normal_exp)
538 b_normal_exp = a_normal_exp;
543 a_normal_exp = b_normal_exp;
549 if (a->sign != b->sign)
553 tfraction = -a_fraction + b_fraction;
557 tfraction = a_fraction - b_fraction;
562 tmp->normal_exp = a_normal_exp;
563 tmp->fraction.ll = tfraction;
568 tmp->normal_exp = a_normal_exp;
569 tmp->fraction.ll = -tfraction;
571 /* and renomalize it */
573 while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
575 tmp->fraction.ll <<= 1;
582 tmp->normal_exp = a_normal_exp;
583 tmp->fraction.ll = a_fraction + b_fraction;
585 tmp->class = CLASS_NUMBER;
586 /* Now the fraction is added, we have to shift down to renormalize the
589 if (tmp->fraction.ll >= IMPLICIT_2)
591 LSHIFT (tmp->fraction.ll);
599 add (FLO_type arg_a, FLO_type arg_b)
606 unpack_d ((FLO_union_type *) & arg_a, &a);
607 unpack_d ((FLO_union_type *) & arg_b, &b);
609 res = _fpadd_parts (&a, &b, &tmp);
615 sub (FLO_type arg_a, FLO_type arg_b)
622 unpack_d ((FLO_union_type *) & arg_a, &a);
623 unpack_d ((FLO_union_type *) & arg_b, &b);
627 res = _fpadd_parts (&a, &b, &tmp);
632 static fp_number_type *
633 _fpmul_parts ( fp_number_type * a,
635 fp_number_type * tmp)
642 a->sign = a->sign != b->sign;
647 b->sign = a->sign != b->sign;
654 a->sign = a->sign != b->sign;
663 b->sign = a->sign != b->sign;
668 a->sign = a->sign != b->sign;
673 b->sign = a->sign != b->sign;
677 /* Calculate the mantissa by multiplying both 64bit numbers to get a
680 fractype x = a->fraction.ll;
681 fractype ylow = b->fraction.ll;
685 #if defined(NO_DI_MODE)
687 /* ??? This does multiplies one bit at a time. Optimize. */
688 for (bit = 0; bit < FRAC_NBITS; bit++)
694 carry = (low += ylow) < ylow;
695 high += yhigh + carry;
708 /* Multiplying two 32 bit numbers to get a 64 bit number on
709 a machine with DI, so we're safe */
711 DItype answer = (DItype)(a->fraction.ll) * (DItype)(b->fraction.ll);
717 /* Doing a 64*64 to 128 */
719 UDItype nl = a->fraction.ll;
720 UDItype nh = a->fraction.ll >> 32;
721 UDItype ml = b->fraction.ll;
722 UDItype mh = b->fraction.ll >>32;
723 UDItype pp_ll = ml * nl;
724 UDItype pp_hl = mh * nl;
725 UDItype pp_lh = ml * nh;
726 UDItype pp_hh = mh * nh;
729 UDItype ps_hh__ = pp_hl + pp_lh;
731 res2 += 0x100000000LL;
732 pp_hl = (ps_hh__ << 32) & 0xffffffff00000000LL;
733 res0 = pp_ll + pp_hl;
736 res2 += ((ps_hh__ >> 32) & 0xffffffffL) + pp_hh;
743 tmp->normal_exp = a->normal_exp + b->normal_exp;
744 tmp->sign = a->sign != b->sign;
746 tmp->normal_exp += 2; /* ??????????????? */
748 tmp->normal_exp += 4; /* ??????????????? */
750 while (high >= IMPLICIT_2)
760 while (high < IMPLICIT_1)
769 /* rounding is tricky. if we only round if it won't make us round later. */
773 if (((high & GARDMASK) != GARDMSB)
774 && (((high + 1) & GARDMASK) == GARDMSB))
776 /* don't round, it gets done again later. */
784 if ((high & GARDMASK) == GARDMSB)
786 if (high & (1 << NGARDS))
788 /* half way, so round to even */
789 high += GARDROUND + 1;
793 /* but we really weren't half way */
794 high += GARDROUND + 1;
797 tmp->fraction.ll = high;
798 tmp->class = CLASS_NUMBER;
803 multiply (FLO_type arg_a, FLO_type arg_b)
810 unpack_d ((FLO_union_type *) & arg_a, &a);
811 unpack_d ((FLO_union_type *) & arg_b, &b);
813 res = _fpmul_parts (&a, &b, &tmp);
818 static fp_number_type *
819 _fpdiv_parts (fp_number_type * a,
821 fp_number_type * tmp)
825 fractype r0, r1, y0, y1, bit;
828 fractype denominator;
840 if (isinf (a) || iszero (a))
842 if (a->class == b->class)
846 a->sign = a->sign ^ b->sign;
856 a->class = CLASS_INFINITY;
860 /* Calculate the mantissa by multiplying both 64bit numbers to get a
864 intfrac d0, d1; /* weren't unsigned before ??? */
867 ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
870 a->normal_exp = a->normal_exp - b->normal_exp;
871 numerator = a->fraction.ll;
872 denominator = b->fraction.ll;
874 if (numerator < denominator)
876 /* Fraction will be less than 1.0 */
882 /* ??? Does divide one bit at a time. Optimize. */
885 if (numerator >= denominator)
888 numerator -= denominator;
894 if ((quotient & GARDMASK) == GARDMSB)
896 if (quotient & (1 << NGARDS))
898 /* half way, so round to even */
899 quotient += GARDROUND + 1;
903 /* but we really weren't half way, more bits exist */
904 quotient += GARDROUND + 1;
908 a->fraction.ll = quotient;
914 divide (FLO_type arg_a, FLO_type arg_b)
921 unpack_d ((FLO_union_type *) & arg_a, &a);
922 unpack_d ((FLO_union_type *) & arg_b, &b);
924 res = _fpdiv_parts (&a, &b, &tmp);
929 /* according to the demo, fpcmp returns a comparison with 0... thus
936 _fpcmp_parts (fp_number_type * a, fp_number_type * b)
939 /* either nan -> unordered. Must be checked outside of this routine. */
940 if (isnan (a) && isnan (b))
942 return 1; /* still unordered! */
946 if (isnan (a) || isnan (b))
948 return 1; /* how to indicate unordered compare? */
950 if (isinf (a) && isinf (b))
952 /* +inf > -inf, but +inf != +inf */
953 /* b \a| +inf(0)| -inf(1)
954 ______\+--------+--------
955 +inf(0)| a==b(0)| a<b(-1)
956 -------+--------+--------
957 -inf(1)| a>b(1) | a==b(0)
958 -------+--------+--------
959 So since unordered must be non zero, just line up the columns...
961 return b->sign - a->sign;
963 /* but not both... */
966 return a->sign ? -1 : 1;
970 return b->sign ? 1 : -1;
972 if (iszero (a) && iszero (b))
978 return b->sign ? 1 : -1;
982 return a->sign ? -1 : 1;
984 /* now both are "normal". */
985 if (a->sign != b->sign)
988 return a->sign ? -1 : 1;
990 /* same sign; exponents? */
991 if (a->normal_exp > b->normal_exp)
993 return a->sign ? -1 : 1;
995 if (a->normal_exp < b->normal_exp)
997 return a->sign ? 1 : -1;
999 /* same exponents; check size. */
1000 if (a->fraction.ll > b->fraction.ll)
1002 return a->sign ? -1 : 1;
1004 if (a->fraction.ll < b->fraction.ll)
1006 return a->sign ? 1 : -1;
1008 /* after all that, they're equal. */
1013 compare (FLO_type arg_a, FLO_type arg_b)
1018 unpack_d ((FLO_union_type *) & arg_a, &a);
1019 unpack_d ((FLO_union_type *) & arg_b, &b);
1021 return _fpcmp_parts (&a, &b);
1024 #ifndef US_SOFTWARE_GOFAST
1026 /* These should be optimized for their specific tasks someday. */
1029 _eq_f2 (FLO_type arg_a, FLO_type arg_b)
1034 unpack_d ((FLO_union_type *) & arg_a, &a);
1035 unpack_d ((FLO_union_type *) & arg_b, &b);
1037 if (isnan (&a) || isnan (&b))
1038 return 1; /* false, truth == 0 */
1040 return _fpcmp_parts (&a, &b) ;
1044 _ne_f2 (FLO_type arg_a, FLO_type arg_b)
1049 unpack_d ((FLO_union_type *) & arg_a, &a);
1050 unpack_d ((FLO_union_type *) & arg_b, &b);
1052 if (isnan (&a) || isnan (&b))
1053 return 1; /* true, truth != 0 */
1055 return _fpcmp_parts (&a, &b) ;
1059 _gt_f2 (FLO_type arg_a, FLO_type arg_b)
1064 unpack_d ((FLO_union_type *) & arg_a, &a);
1065 unpack_d ((FLO_union_type *) & arg_b, &b);
1067 if (isnan (&a) || isnan (&b))
1068 return -1; /* false, truth > 0 */
1070 return _fpcmp_parts (&a, &b);
1074 _ge_f2 (FLO_type arg_a, FLO_type arg_b)
1079 unpack_d ((FLO_union_type *) & arg_a, &a);
1080 unpack_d ((FLO_union_type *) & arg_b, &b);
1082 if (isnan (&a) || isnan (&b))
1083 return -1; /* false, truth >= 0 */
1084 return _fpcmp_parts (&a, &b) ;
1088 _lt_f2 (FLO_type arg_a, FLO_type arg_b)
1093 unpack_d ((FLO_union_type *) & arg_a, &a);
1094 unpack_d ((FLO_union_type *) & arg_b, &b);
1096 if (isnan (&a) || isnan (&b))
1097 return 1; /* false, truth < 0 */
1099 return _fpcmp_parts (&a, &b);
1103 _le_f2 (FLO_type arg_a, FLO_type arg_b)
1108 unpack_d ((FLO_union_type *) & arg_a, &a);
1109 unpack_d ((FLO_union_type *) & arg_b, &b);
1111 if (isnan (&a) || isnan (&b))
1112 return 1; /* false, truth <= 0 */
1114 return _fpcmp_parts (&a, &b) ;
1117 #endif /* ! US_SOFTWARE_GOFAST */
1120 si_to_float (SItype arg_a)
1124 in.class = CLASS_NUMBER;
1125 in.sign = arg_a < 0;
1128 in.class = CLASS_ZERO;
1132 in.normal_exp = FRACBITS + NGARDS;
1135 /* Special case for minint, since there is no +ve integer
1136 representation for it */
1137 if (arg_a == 0x80000000)
1139 return -2147483648.0;
1141 in.fraction.ll = (-arg_a);
1144 in.fraction.ll = arg_a;
1146 while (in.fraction.ll < (1LL << (FRACBITS + NGARDS)))
1148 in.fraction.ll <<= 1;
1152 return pack_d (&in);
1156 float_to_si (FLO_type arg_a)
1161 unpack_d ((FLO_union_type *) & arg_a, &a);
1166 /* get reasonable MAX_SI_INT... */
1168 return a.sign ? MAX_SI_INT : (-MAX_SI_INT)-1;
1169 /* it is a number, but a small one */
1170 if (a.normal_exp < 0)
1172 if (a.normal_exp > 30)
1173 return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1174 tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1175 return a.sign ? (-tmp) : (tmp);
1178 #ifdef US_SOFTWARE_GOFAST
1179 /* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
1180 we also define them for GOFAST because the ones in libgcc2.c have the
1181 wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
1182 out of libgcc2.c. We can't define these here if not GOFAST because then
1183 there'd be duplicate copies. */
1186 float_to_usi (FLO_type arg_a)
1190 unpack_d ((FLO_union_type *) & arg_a, &a);
1195 /* get reasonable MAX_USI_INT... */
1197 return a.sign ? MAX_USI_INT : 0;
1198 /* it is a negative number */
1201 /* it is a number, but a small one */
1202 if (a.normal_exp < 0)
1204 if (a.normal_exp > 31)
1206 else if (a.normal_exp > (FRACBITS + NGARDS))
1207 return a.fraction.ll << ((FRACBITS + NGARDS) - a.normal_exp);
1209 return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1214 negate (FLO_type arg_a)
1218 unpack_d ((FLO_union_type *) & arg_a, &a);
1226 __make_fp(fp_class_type class,
1235 in.normal_exp = exp;
1236 in.fraction.ll = frac;
1237 return pack_d (&in);
1242 /* This enables one to build an fp library that supports float but not double.
1243 Otherwise, we would get an undefined reference to __make_dp.
1244 This is needed for some 8-bit ports that can't handle well values that
1245 are 8-bytes in size, so we just don't support double for them at all. */
1247 extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype frac);
1250 sf_to_df (SFtype arg_a)
1254 unpack_d ((FLO_union_type *) & arg_a, &in);
1255 return __make_dp (in.class, in.sign, in.normal_exp,
1256 ((UDItype) in.fraction.ll) << F_D_BITOFF);
1264 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1267 __make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1273 in.normal_exp = exp;
1274 in.fraction.ll = frac;
1275 return pack_d (&in);
1279 df_to_sf (DFtype arg_a)
1283 unpack_d ((FLO_union_type *) & arg_a, &in);
1284 return __make_fp (in.class, in.sign, in.normal_exp,
1285 in.fraction.ll >> F_D_BITOFF);