1 /* real.c - implementation of REAL_ARITHMETIC, REAL_VALUE_ATOF,
2 and support for XFmode IEEE extended real floating point arithmetic.
3 Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
4 Contributed by Stephen L. Moshier (moshier@world.std.com).
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
32 /* To enable support of XFmode extended real floating point, define
33 LONG_DOUBLE_TYPE_SIZE 96 in the tm.h file (m68k.h or i386.h).
35 To support cross compilation between IEEE, VAX and IBM floating
36 point formats, define REAL_ARITHMETIC in the tm.h file.
38 In either case the machine files (tm.h) must not contain any code
39 that tries to use host floating point arithmetic to convert
40 REAL_VALUE_TYPEs from `double' to `float', pass them to fprintf,
41 etc. In cross-compile situations a REAL_VALUE_TYPE may not
42 be intelligible to the host computer's native arithmetic.
44 The emulator defaults to the host's floating point format so that
45 its decimal conversion functions can be used if desired (see
48 The first part of this file interfaces gcc to a floating point
49 arithmetic suite that was not written with gcc in mind. Avoid
50 changing the low-level arithmetic routines unless you have suitable
51 test programs available. A special version of the PARANOIA floating
52 point arithmetic tester, modified for this purpose, can be found on
53 usc.edu: /pub/C-numanal/ieeetest.zoo. Other tests, and libraries of
54 XFmode and TFmode transcendental functions, can be obtained by ftp from
55 netlib.att.com: netlib/cephes. */
57 /* Type of computer arithmetic.
58 Only one of DEC, IBM, IEEE, or UNK should get defined.
60 `IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically
61 to big-endian IEEE floating-point data structure. This definition
62 should work in SFmode `float' type and DFmode `double' type on
63 virtually all big-endian IEEE machines. If LONG_DOUBLE_TYPE_SIZE
64 has been defined to be 96, then IEEE also invokes the particular
65 XFmode (`long double' type) data structure used by the Motorola
66 680x0 series processors.
68 `IEEE', when REAL_WORDS_BIG_ENDIAN is zero, refers generally to
69 little-endian IEEE machines. In this case, if LONG_DOUBLE_TYPE_SIZE
70 has been defined to be 96, then IEEE also invokes the particular
71 XFmode `long double' data structure used by the Intel 80x86 series
74 `DEC' refers specifically to the Digital Equipment Corp PDP-11
75 and VAX floating point data structure. This model currently
76 supports no type wider than DFmode.
78 `IBM' refers specifically to the IBM System/370 and compatible
79 floating point data structure. This model currently supports
80 no type wider than DFmode. The IBM conversions were contributed by
81 frank@atom.ansto.gov.au (Frank Crawford).
83 If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
84 then `long double' and `double' are both implemented, but they
85 both mean DFmode. In this case, the software floating-point
86 support available here is activated by writing
87 #define REAL_ARITHMETIC
90 The case LONG_DOUBLE_TYPE_SIZE = 128 activates TFmode support
91 and may deactivate XFmode since `long double' is used to refer
94 The macros FLOAT_WORDS_BIG_ENDIAN, HOST_FLOAT_WORDS_BIG_ENDIAN,
95 contributed by Richard Earnshaw <Richard.Earnshaw@cl.cam.ac.uk>,
96 separate the floating point unit's endian-ness from that of
97 the integer addressing. This permits one to define a big-endian
98 FPU on a little-endian machine (e.g., ARM). An extension to
99 BYTES_BIG_ENDIAN may be required for some machines in the future.
100 These optional macros may be defined in tm.h. In real.h, they
101 default to WORDS_BIG_ENDIAN, etc., so there is no need to define
102 them for any normal host or target machine on which the floats
103 and the integers have the same endian-ness. */
106 /* The following converts gcc macros into the ones used by this file. */
108 /* REAL_ARITHMETIC defined means that macros in real.h are
109 defined to call emulator functions. */
110 #ifdef REAL_ARITHMETIC
112 #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT
113 /* PDP-11, Pro350, VAX: */
115 #else /* it's not VAX */
116 #if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT
117 /* IBM System/370 style */
119 #else /* it's also not an IBM */
120 #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
122 #else /* it's not IEEE either */
123 /* UNKnown arithmetic. We don't support this and can't go on. */
124 unknown arithmetic type
126 #endif /* not IEEE */
130 #define REAL_WORDS_BIG_ENDIAN FLOAT_WORDS_BIG_ENDIAN
133 /* REAL_ARITHMETIC not defined means that the *host's* data
134 structure will be used. It may differ by endian-ness from the
135 target machine's structure and will get its ends swapped
136 accordingly (but not here). Probably only the decimal <-> binary
137 functions in this file will actually be used in this case. */
139 #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
141 #else /* it's not VAX */
142 #if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT
143 /* IBM System/370 style */
145 #else /* it's also not an IBM */
146 #if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
148 #else /* it's not IEEE either */
149 unknown arithmetic type
151 #endif /* not IEEE */
155 #define REAL_WORDS_BIG_ENDIAN HOST_FLOAT_WORDS_BIG_ENDIAN
157 #endif /* REAL_ARITHMETIC not defined */
159 /* Define INFINITY for support of infinity.
160 Define NANS for support of Not-a-Number's (NaN's). */
161 #if !defined(DEC) && !defined(IBM)
166 /* Support of NaNs requires support of infinity. */
173 /* Find a host integer type that is at least 16 bits wide,
174 and another type at least twice whatever that size is. */
176 #if HOST_BITS_PER_CHAR >= 16
177 #define EMUSHORT char
178 #define EMUSHORT_SIZE HOST_BITS_PER_CHAR
179 #define EMULONG_SIZE (2 * HOST_BITS_PER_CHAR)
181 #if HOST_BITS_PER_SHORT >= 16
182 #define EMUSHORT short
183 #define EMUSHORT_SIZE HOST_BITS_PER_SHORT
184 #define EMULONG_SIZE (2 * HOST_BITS_PER_SHORT)
186 #if HOST_BITS_PER_INT >= 16
188 #define EMUSHORT_SIZE HOST_BITS_PER_INT
189 #define EMULONG_SIZE (2 * HOST_BITS_PER_INT)
191 #if HOST_BITS_PER_LONG >= 16
192 #define EMUSHORT long
193 #define EMUSHORT_SIZE HOST_BITS_PER_LONG
194 #define EMULONG_SIZE (2 * HOST_BITS_PER_LONG)
196 /* You will have to modify this program to have a smaller unit size. */
197 #define EMU_NON_COMPILE
203 #if HOST_BITS_PER_SHORT >= EMULONG_SIZE
204 #define EMULONG short
206 #if HOST_BITS_PER_INT >= EMULONG_SIZE
209 #if HOST_BITS_PER_LONG >= EMULONG_SIZE
212 #if HOST_BITS_PER_LONGLONG >= EMULONG_SIZE
213 #define EMULONG long long int
215 /* You will have to modify this program to have a smaller unit size. */
216 #define EMU_NON_COMPILE
223 /* The host interface doesn't work if no 16-bit size exists. */
224 #if EMUSHORT_SIZE != 16
225 #define EMU_NON_COMPILE
228 /* OK to continue compilation. */
229 #ifndef EMU_NON_COMPILE
231 /* Construct macros to translate between REAL_VALUE_TYPE and e type.
232 In GET_REAL and PUT_REAL, r and e are pointers.
233 A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations
234 in memory, with no holes. */
236 #if LONG_DOUBLE_TYPE_SIZE == 96
237 /* Number of 16 bit words in external e type format */
239 #define MAXDECEXP 4932
240 #define MINDECEXP -4956
241 #define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE)
242 #define PUT_REAL(e,r) bcopy ((char *) e, (char *) r, 2*NE)
243 #else /* no XFmode */
244 #if LONG_DOUBLE_TYPE_SIZE == 128
246 #define MAXDECEXP 4932
247 #define MINDECEXP -4977
248 #define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE)
249 #define PUT_REAL(e,r) bcopy ((char *) e, (char *) r, 2*NE)
252 #define MAXDECEXP 4932
253 #define MINDECEXP -4956
254 #ifdef REAL_ARITHMETIC
255 /* Emulator uses target format internally
256 but host stores it in host endian-ness. */
258 #define GET_REAL(r,e) \
260 if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \
261 e53toe ((unsigned EMUSHORT *) (r), (e)); \
264 unsigned EMUSHORT w[4]; \
265 w[3] = ((EMUSHORT *) r)[0]; \
266 w[2] = ((EMUSHORT *) r)[1]; \
267 w[1] = ((EMUSHORT *) r)[2]; \
268 w[0] = ((EMUSHORT *) r)[3]; \
273 #define PUT_REAL(e,r) \
275 if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \
276 etoe53 ((e), (unsigned EMUSHORT *) (r)); \
279 unsigned EMUSHORT w[4]; \
281 *((EMUSHORT *) r) = w[3]; \
282 *((EMUSHORT *) r + 1) = w[2]; \
283 *((EMUSHORT *) r + 2) = w[1]; \
284 *((EMUSHORT *) r + 3) = w[0]; \
288 #else /* not REAL_ARITHMETIC */
290 /* emulator uses host format */
291 #define GET_REAL(r,e) e53toe ((unsigned EMUSHORT *) (r), (e))
292 #define PUT_REAL(e,r) etoe53 ((e), (unsigned EMUSHORT *) (r))
294 #endif /* not REAL_ARITHMETIC */
295 #endif /* not TFmode */
296 #endif /* no XFmode */
299 /* Number of 16 bit words in internal format */
302 /* Array offset to exponent */
305 /* Array offset to high guard word */
308 /* Number of bits of precision */
309 #define NBITS ((NI-4)*16)
311 /* Maximum number of decimal digits in ASCII conversion
314 #define NDEC (NBITS*8/27)
316 /* The exponent of 1.0 */
317 #define EXONE (0x3fff)
319 extern int extra_warnings
;
320 extern unsigned EMUSHORT ezero
[], ehalf
[], eone
[], etwo
[];
321 extern unsigned EMUSHORT elog2
[], esqrt2
[];
323 static void endian
PROTO((unsigned EMUSHORT
*, long *,
325 static void eclear
PROTO((unsigned EMUSHORT
*));
326 static void emov
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
327 static void eabs
PROTO((unsigned EMUSHORT
*));
328 static void eneg
PROTO((unsigned EMUSHORT
*));
329 static int eisneg
PROTO((unsigned EMUSHORT
*));
330 static int eisinf
PROTO((unsigned EMUSHORT
*));
331 static int eisnan
PROTO((unsigned EMUSHORT
*));
332 static void einfin
PROTO((unsigned EMUSHORT
*));
333 static void enan
PROTO((unsigned EMUSHORT
*, int));
334 static void emovi
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
335 static void emovo
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
336 static void ecleaz
PROTO((unsigned EMUSHORT
*));
337 static void ecleazs
PROTO((unsigned EMUSHORT
*));
338 static void emovz
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
339 static void einan
PROTO((unsigned EMUSHORT
*));
340 static int eiisnan
PROTO((unsigned EMUSHORT
*));
341 static int eiisneg
PROTO((unsigned EMUSHORT
*));
342 static void eiinfin
PROTO((unsigned EMUSHORT
*));
343 static int eiisinf
PROTO((unsigned EMUSHORT
*));
344 static int ecmpm
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
345 static void eshdn1
PROTO((unsigned EMUSHORT
*));
346 static void eshup1
PROTO((unsigned EMUSHORT
*));
347 static void eshdn8
PROTO((unsigned EMUSHORT
*));
348 static void eshup8
PROTO((unsigned EMUSHORT
*));
349 static void eshup6
PROTO((unsigned EMUSHORT
*));
350 static void eshdn6
PROTO((unsigned EMUSHORT
*));
351 static void eaddm
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));\f
352 static void esubm
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
353 static void m16m
PROTO((unsigned int, unsigned short *,
355 static int edivm
PROTO((unsigned short *, unsigned short *));
356 static int emulm
PROTO((unsigned short *, unsigned short *));
357 static void emdnorm
PROTO((unsigned EMUSHORT
*, int, int, EMULONG
, int));
358 static void esub
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
359 unsigned EMUSHORT
*));
360 static void eadd
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
361 unsigned EMUSHORT
*));
362 static void eadd1
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
363 unsigned EMUSHORT
*));
364 static void ediv
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
365 unsigned EMUSHORT
*));
366 static void emul
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
367 unsigned EMUSHORT
*));
368 static void e53toe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
369 static void e64toe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
370 static void e113toe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
371 static void e24toe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
372 static void etoe113
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
373 static void toe113
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
374 static void etoe64
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
375 static void toe64
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
376 static void etoe53
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
377 static void toe53
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
378 static void etoe24
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
379 static void toe24
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
380 static int ecmp
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
381 static void eround
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
382 static void ltoe
PROTO((HOST_WIDE_INT
*, unsigned EMUSHORT
*));
383 static void ultoe
PROTO((unsigned HOST_WIDE_INT
*, unsigned EMUSHORT
*));
384 static void eifrac
PROTO((unsigned EMUSHORT
*, HOST_WIDE_INT
*,
385 unsigned EMUSHORT
*));
386 static void euifrac
PROTO((unsigned EMUSHORT
*, unsigned HOST_WIDE_INT
*,
387 unsigned EMUSHORT
*));
388 static int eshift
PROTO((unsigned EMUSHORT
*, int));
389 static int enormlz
PROTO((unsigned EMUSHORT
*));
390 static void e24toasc
PROTO((unsigned EMUSHORT
*, char *, int));
391 static void e53toasc
PROTO((unsigned EMUSHORT
*, char *, int));
392 static void e64toasc
PROTO((unsigned EMUSHORT
*, char *, int));
393 static void e113toasc
PROTO((unsigned EMUSHORT
*, char *, int));
394 static void etoasc
PROTO((unsigned EMUSHORT
*, char *, int));
395 static void asctoe24
PROTO((char *, unsigned EMUSHORT
*));
396 static void asctoe53
PROTO((char *, unsigned EMUSHORT
*));
397 static void asctoe64
PROTO((char *, unsigned EMUSHORT
*));
398 static void asctoe113
PROTO((char *, unsigned EMUSHORT
*));
399 static void asctoe
PROTO((char *, unsigned EMUSHORT
*));
400 static void asctoeg
PROTO((char *, unsigned EMUSHORT
*, int));
401 static void efloor
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
402 static void efrexp
PROTO((unsigned EMUSHORT
*, int *,
403 unsigned EMUSHORT
*));
404 static void eldexp
PROTO((unsigned EMUSHORT
*, int, unsigned EMUSHORT
*));
405 static void eremain
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
406 unsigned EMUSHORT
*));
407 static void eiremain
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
408 static void mtherr
PROTO((char *, int));
410 static void dectoe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
411 static void etodec
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
412 static void todec
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
415 static void ibmtoe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
417 static void etoibm
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
419 static void toibm
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*,
422 static void make_nan
PROTO((unsigned EMUSHORT
*, int, enum machine_mode
));
423 static void uditoe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
424 static void ditoe
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
425 static void etoudi
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
426 static void etodi
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
427 static void esqrt
PROTO((unsigned EMUSHORT
*, unsigned EMUSHORT
*));
429 /* Copy 32-bit numbers obtained from array containing 16-bit numbers,
430 swapping ends if required, into output array of longs. The
431 result is normally passed to fprintf by the ASM_OUTPUT_ macros. */
435 unsigned EMUSHORT e
[];
437 enum machine_mode mode
;
441 if (REAL_WORDS_BIG_ENDIAN
)
447 /* Swap halfwords in the fourth long. */
448 th
= (unsigned long) e
[6] & 0xffff;
449 t
= (unsigned long) e
[7] & 0xffff;
455 /* Swap halfwords in the third long. */
456 th
= (unsigned long) e
[4] & 0xffff;
457 t
= (unsigned long) e
[5] & 0xffff;
460 /* fall into the double case */
464 /* swap halfwords in the second word */
465 th
= (unsigned long) e
[2] & 0xffff;
466 t
= (unsigned long) e
[3] & 0xffff;
469 /* fall into the float case */
474 /* swap halfwords in the first word */
475 th
= (unsigned long) e
[0] & 0xffff;
476 t
= (unsigned long) e
[1] & 0xffff;
487 /* Pack the output array without swapping. */
494 /* Pack the fourth long. */
495 th
= (unsigned long) e
[7] & 0xffff;
496 t
= (unsigned long) e
[6] & 0xffff;
502 /* Pack the third long.
503 Each element of the input REAL_VALUE_TYPE array has 16 useful bits
505 th
= (unsigned long) e
[5] & 0xffff;
506 t
= (unsigned long) e
[4] & 0xffff;
509 /* fall into the double case */
513 /* pack the second long */
514 th
= (unsigned long) e
[3] & 0xffff;
515 t
= (unsigned long) e
[2] & 0xffff;
518 /* fall into the float case */
523 /* pack the first long */
524 th
= (unsigned long) e
[1] & 0xffff;
525 t
= (unsigned long) e
[0] & 0xffff;
537 /* This is the implementation of the REAL_ARITHMETIC macro. */
540 earith (value
, icode
, r1
, r2
)
541 REAL_VALUE_TYPE
*value
;
546 unsigned EMUSHORT d1
[NE
], d2
[NE
], v
[NE
];
552 /* Return NaN input back to the caller. */
555 PUT_REAL (d1
, value
);
560 PUT_REAL (d2
, value
);
564 code
= (enum tree_code
) icode
;
572 esub (d2
, d1
, v
); /* d1 - d2 */
580 #ifndef REAL_INFINITY
581 if (ecmp (d2
, ezero
) == 0)
584 enan (v
, eisneg (d1
) ^ eisneg (d2
));
591 ediv (d2
, d1
, v
); /* d1/d2 */
594 case MIN_EXPR
: /* min (d1,d2) */
595 if (ecmp (d1
, d2
) < 0)
601 case MAX_EXPR
: /* max (d1,d2) */
602 if (ecmp (d1
, d2
) > 0)
615 /* Truncate REAL_VALUE_TYPE toward zero to signed HOST_WIDE_INT.
616 implements REAL_VALUE_RNDZINT (x) (etrunci (x)). */
622 unsigned EMUSHORT f
[NE
], g
[NE
];
638 /* Truncate REAL_VALUE_TYPE toward zero to unsigned HOST_WIDE_INT;
639 implements REAL_VALUE_UNSIGNED_RNDZINT (x) (etruncui (x)). */
645 unsigned EMUSHORT f
[NE
], g
[NE
];
647 unsigned HOST_WIDE_INT l
;
661 /* This is the REAL_VALUE_ATOF function. It converts a decimal string to
662 binary, rounding off as indicated by the machine_mode argument. Then it
663 promotes the rounded value to REAL_VALUE_TYPE. */
670 unsigned EMUSHORT tem
[NE
], e
[NE
];
700 /* Expansion of REAL_NEGATE. */
706 unsigned EMUSHORT e
[NE
];
716 /* Round real toward zero to HOST_WIDE_INT;
717 implements REAL_VALUE_FIX (x). */
723 unsigned EMUSHORT f
[NE
], g
[NE
];
730 warning ("conversion from NaN to int");
738 /* Round real toward zero to unsigned HOST_WIDE_INT
739 implements REAL_VALUE_UNSIGNED_FIX (x).
740 Negative input returns zero. */
742 unsigned HOST_WIDE_INT
746 unsigned EMUSHORT f
[NE
], g
[NE
];
747 unsigned HOST_WIDE_INT l
;
753 warning ("conversion from NaN to unsigned int");
762 /* REAL_VALUE_FROM_INT macro. */
765 ereal_from_int (d
, i
, j
, mode
)
768 enum machine_mode mode
;
770 unsigned EMUSHORT df
[NE
], dg
[NE
];
771 HOST_WIDE_INT low
, high
;
774 if (GET_MODE_CLASS (mode
) != MODE_FLOAT
)
781 /* complement and add 1 */
788 eldexp (eone
, HOST_BITS_PER_WIDE_INT
, df
);
789 ultoe ((unsigned HOST_WIDE_INT
*) &high
, dg
);
791 ultoe ((unsigned HOST_WIDE_INT
*) &low
, df
);
796 /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
797 Avoid double-rounding errors later by rounding off now from the
798 extra-wide internal format to the requested precision. */
799 switch (GET_MODE_BITSIZE (mode
))
829 /* REAL_VALUE_FROM_UNSIGNED_INT macro. */
832 ereal_from_uint (d
, i
, j
, mode
)
834 unsigned HOST_WIDE_INT i
, j
;
835 enum machine_mode mode
;
837 unsigned EMUSHORT df
[NE
], dg
[NE
];
838 unsigned HOST_WIDE_INT low
, high
;
840 if (GET_MODE_CLASS (mode
) != MODE_FLOAT
)
844 eldexp (eone
, HOST_BITS_PER_WIDE_INT
, df
);
850 /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
851 Avoid double-rounding errors later by rounding off now from the
852 extra-wide internal format to the requested precision. */
853 switch (GET_MODE_BITSIZE (mode
))
883 /* REAL_VALUE_TO_INT macro. */
886 ereal_to_int (low
, high
, rr
)
887 HOST_WIDE_INT
*low
, *high
;
890 unsigned EMUSHORT d
[NE
], df
[NE
], dg
[NE
], dh
[NE
];
897 warning ("conversion from NaN to int");
903 /* convert positive value */
910 eldexp (eone
, HOST_BITS_PER_WIDE_INT
, df
);
911 ediv (df
, d
, dg
); /* dg = d / 2^32 is the high word */
912 euifrac (dg
, (unsigned HOST_WIDE_INT
*) high
, dh
);
913 emul (df
, dh
, dg
); /* fractional part is the low word */
914 euifrac (dg
, (unsigned HOST_WIDE_INT
*)low
, dh
);
917 /* complement and add 1 */
927 /* REAL_VALUE_LDEXP macro. */
934 unsigned EMUSHORT e
[NE
], y
[NE
];
947 /* These routines are conditionally compiled because functions
948 of the same names may be defined in fold-const.c. */
950 #ifdef REAL_ARITHMETIC
952 /* Check for infinity in a REAL_VALUE_TYPE. */
958 unsigned EMUSHORT e
[NE
];
968 /* Check whether a REAL_VALUE_TYPE item is a NaN. */
974 unsigned EMUSHORT e
[NE
];
985 /* Check for a negative REAL_VALUE_TYPE number.
986 This just checks the sign bit, so that -0 counts as negative. */
992 return ereal_isneg (x
);
995 /* Expansion of REAL_VALUE_TRUNCATE.
996 The result is in floating point, rounded to nearest or even. */
999 real_value_truncate (mode
, arg
)
1000 enum machine_mode mode
;
1001 REAL_VALUE_TYPE arg
;
1003 unsigned EMUSHORT e
[NE
], t
[NE
];
1039 /* If an unsupported type was requested, presume that
1040 the machine files know something useful to do with
1041 the unmodified value. */
1050 /* Try to change R into its exact multiplicative inverse in machine mode
1051 MODE. Return nonzero function value if successful. */
1054 exact_real_inverse (mode
, r
)
1055 enum machine_mode mode
;
1058 unsigned EMUSHORT e
[NE
], einv
[NE
];
1059 REAL_VALUE_TYPE rinv
;
1064 /* Test for input in range. Don't transform IEEE special values. */
1065 if (eisinf (e
) || eisnan (e
) || (ecmp (e
, ezero
) == 0))
1068 /* Test for a power of 2: all significand bits zero except the MSB.
1069 We are assuming the target has binary (or hex) arithmetic. */
1070 if (e
[NE
- 2] != 0x8000)
1073 for (i
= 0; i
< NE
- 2; i
++)
1079 /* Compute the inverse and truncate it to the required mode. */
1080 ediv (e
, eone
, einv
);
1081 PUT_REAL (einv
, &rinv
);
1082 rinv
= real_value_truncate (mode
, rinv
);
1084 #ifdef CHECK_FLOAT_VALUE
1085 /* This check is not redundant. It may, for example, flush
1086 a supposedly IEEE denormal value to zero. */
1088 if (CHECK_FLOAT_VALUE (mode
, rinv
, i
))
1091 GET_REAL (&rinv
, einv
);
1093 /* Check the bits again, because the truncation might have
1094 generated an arbitrary saturation value on overflow. */
1095 if (einv
[NE
- 2] != 0x8000)
1098 for (i
= 0; i
< NE
- 2; i
++)
1104 /* Fail if the computed inverse is out of range. */
1105 if (eisinf (einv
) || eisnan (einv
) || (ecmp (einv
, ezero
) == 0))
1108 /* Output the reciprocal and return success flag. */
1112 #endif /* REAL_ARITHMETIC defined */
1114 /* Used for debugging--print the value of R in human-readable format
1123 REAL_VALUE_TO_DECIMAL (r
, "%.20g", dstr
);
1124 fprintf (stderr
, "%s", dstr
);
1128 /* The following routines convert REAL_VALUE_TYPE to the various floating
1129 point formats that are meaningful to supported computers.
1131 The results are returned in 32-bit pieces, each piece stored in a `long'.
1132 This is so they can be printed by statements like
1134 fprintf (file, "%lx, %lx", L[0], L[1]);
1136 that will work on both narrow- and wide-word host computers. */
1138 /* Convert R to a 128-bit long double precision value. The output array L
1139 contains four 32-bit pieces of the result, in the order they would appear
1147 unsigned EMUSHORT e
[NE
];
1151 endian (e
, l
, TFmode
);
1154 /* Convert R to a double extended precision value. The output array L
1155 contains three 32-bit pieces of the result, in the order they would
1156 appear in memory. */
1163 unsigned EMUSHORT e
[NE
];
1167 endian (e
, l
, XFmode
);
1170 /* Convert R to a double precision value. The output array L contains two
1171 32-bit pieces of the result, in the order they would appear in memory. */
1178 unsigned EMUSHORT e
[NE
];
1182 endian (e
, l
, DFmode
);
1185 /* Convert R to a single precision float value stored in the least-significant
1186 bits of a `long'. */
1192 unsigned EMUSHORT e
[NE
];
1197 endian (e
, &l
, SFmode
);
1201 /* Convert X to a decimal ASCII string S for output to an assembly
1202 language file. Note, there is no standard way to spell infinity or
1203 a NaN, so these values may require special treatment in the tm.h
1207 ereal_to_decimal (x
, s
)
1211 unsigned EMUSHORT e
[NE
];
1217 /* Compare X and Y. Return 1 if X > Y, 0 if X == Y, -1 if X < Y,
1218 or -2 if either is a NaN. */
1222 REAL_VALUE_TYPE x
, y
;
1224 unsigned EMUSHORT ex
[NE
], ey
[NE
];
1228 return (ecmp (ex
, ey
));
1231 /* Return 1 if the sign bit of X is set, else return 0. */
1237 unsigned EMUSHORT ex
[NE
];
1240 return (eisneg (ex
));
1243 /* End of REAL_ARITHMETIC interface */
1246 Extended precision IEEE binary floating point arithmetic routines
1248 Numbers are stored in C language as arrays of 16-bit unsigned
1249 short integers. The arguments of the routines are pointers to
1252 External e type data structure, similar to Intel 8087 chip
1253 temporary real format but possibly with a larger significand:
1255 NE-1 significand words (least significant word first,
1256 most significant bit is normally set)
1257 exponent (value = EXONE for 1.0,
1258 top bit is the sign)
1261 Internal exploded e-type data structure of a number (a "word" is 16 bits):
1263 ei[0] sign word (0 for positive, 0xffff for negative)
1264 ei[1] biased exponent (value = EXONE for the number 1.0)
1265 ei[2] high guard word (always zero after normalization)
1267 to ei[NI-2] significand (NI-4 significand words,
1268 most significant word first,
1269 most significant bit is set)
1270 ei[NI-1] low guard word (0x8000 bit is rounding place)
1274 Routines for external format e-type numbers
1276 asctoe (string, e) ASCII string to extended double e type
1277 asctoe64 (string, &d) ASCII string to long double
1278 asctoe53 (string, &d) ASCII string to double
1279 asctoe24 (string, &f) ASCII string to single
1280 asctoeg (string, e, prec) ASCII string to specified precision
1281 e24toe (&f, e) IEEE single precision to e type
1282 e53toe (&d, e) IEEE double precision to e type
1283 e64toe (&d, e) IEEE long double precision to e type
1284 e113toe (&d, e) 128-bit long double precision to e type
1285 eabs (e) absolute value
1286 eadd (a, b, c) c = b + a
1288 ecmp (a, b) Returns 1 if a > b, 0 if a == b,
1289 -1 if a < b, -2 if either a or b is a NaN.
1290 ediv (a, b, c) c = b / a
1291 efloor (a, b) truncate to integer, toward -infinity
1292 efrexp (a, exp, s) extract exponent and significand
1293 eifrac (e, &l, frac) e to HOST_WIDE_INT and e type fraction
1294 euifrac (e, &l, frac) e to unsigned HOST_WIDE_INT and e type fraction
1295 einfin (e) set e to infinity, leaving its sign alone
1296 eldexp (a, n, b) multiply by 2**n
1298 emul (a, b, c) c = b * a
1300 eround (a, b) b = nearest integer value to a
1301 esub (a, b, c) c = b - a
1302 e24toasc (&f, str, n) single to ASCII string, n digits after decimal
1303 e53toasc (&d, str, n) double to ASCII string, n digits after decimal
1304 e64toasc (&d, str, n) 80-bit long double to ASCII string
1305 e113toasc (&d, str, n) 128-bit long double to ASCII string
1306 etoasc (e, str, n) e to ASCII string, n digits after decimal
1307 etoe24 (e, &f) convert e type to IEEE single precision
1308 etoe53 (e, &d) convert e type to IEEE double precision
1309 etoe64 (e, &d) convert e type to IEEE long double precision
1310 ltoe (&l, e) HOST_WIDE_INT to e type
1311 ultoe (&l, e) unsigned HOST_WIDE_INT to e type
1312 eisneg (e) 1 if sign bit of e != 0, else 0
1313 eisinf (e) 1 if e has maximum exponent (non-IEEE)
1314 or is infinite (IEEE)
1315 eisnan (e) 1 if e is a NaN
1318 Routines for internal format exploded e-type numbers
1320 eaddm (ai, bi) add significands, bi = bi + ai
1322 ecleazs (ei) set ei = 0 but leave its sign alone
1323 ecmpm (ai, bi) compare significands, return 1, 0, or -1
1324 edivm (ai, bi) divide significands, bi = bi / ai
1325 emdnorm (ai,l,s,exp) normalize and round off
1326 emovi (a, ai) convert external a to internal ai
1327 emovo (ai, a) convert internal ai to external a
1328 emovz (ai, bi) bi = ai, low guard word of bi = 0
1329 emulm (ai, bi) multiply significands, bi = bi * ai
1330 enormlz (ei) left-justify the significand
1331 eshdn1 (ai) shift significand and guards down 1 bit
1332 eshdn8 (ai) shift down 8 bits
1333 eshdn6 (ai) shift down 16 bits
1334 eshift (ai, n) shift ai n bits up (or down if n < 0)
1335 eshup1 (ai) shift significand and guards up 1 bit
1336 eshup8 (ai) shift up 8 bits
1337 eshup6 (ai) shift up 16 bits
1338 esubm (ai, bi) subtract significands, bi = bi - ai
1339 eiisinf (ai) 1 if infinite
1340 eiisnan (ai) 1 if a NaN
1341 eiisneg (ai) 1 if sign bit of ai != 0, else 0
1342 einan (ai) set ai = NaN
1343 eiinfin (ai) set ai = infinity
1345 The result is always normalized and rounded to NI-4 word precision
1346 after each arithmetic operation.
1348 Exception flags are NOT fully supported.
1350 Signaling NaN's are NOT supported; they are treated the same
1353 Define INFINITY for support of infinity; otherwise a
1354 saturation arithmetic is implemented.
1356 Define NANS for support of Not-a-Number items; otherwise the
1357 arithmetic will never produce a NaN output, and might be confused
1359 If NaN's are supported, the output of `ecmp (a,b)' is -2 if
1360 either a or b is a NaN. This means asking `if (ecmp (a,b) < 0)'
1361 may not be legitimate. Use `if (ecmp (a,b) == -1)' for `less than'
1364 Denormals are always supported here where appropriate (e.g., not
1365 for conversion to DEC numbers). */
1367 /* Definitions for error codes that are passed to the common error handling
1370 For Digital Equipment PDP-11 and VAX computers, certain
1371 IBM systems, and others that use numbers with a 56-bit
1372 significand, the symbol DEC should be defined. In this
1373 mode, most floating point constants are given as arrays
1374 of octal integers to eliminate decimal to binary conversion
1375 errors that might be introduced by the compiler.
1377 For computers, such as IBM PC, that follow the IEEE
1378 Standard for Binary Floating Point Arithmetic (ANSI/IEEE
1379 Std 754-1985), the symbol IEEE should be defined.
1380 These numbers have 53-bit significands. In this mode, constants
1381 are provided as arrays of hexadecimal 16 bit integers.
1382 The endian-ness of generated values is controlled by
1383 REAL_WORDS_BIG_ENDIAN.
1385 To accommodate other types of computer arithmetic, all
1386 constants are also provided in a normal decimal radix
1387 which one can hope are correctly converted to a suitable
1388 format by the available C language compiler. To invoke
1389 this mode, the symbol UNK is defined.
1391 An important difference among these modes is a predefined
1392 set of machine arithmetic constants for each. The numbers
1393 MACHEP (the machine roundoff error), MAXNUM (largest number
1394 represented), and several other parameters are preset by
1395 the configuration symbol. Check the file const.c to
1396 ensure that these values are correct for your computer.
1398 For ANSI C compatibility, define ANSIC equal to 1. Currently
1399 this affects only the atan2 function and others that use it. */
1401 /* Constant definitions for math error conditions. */
1403 #define DOMAIN 1 /* argument domain error */
1404 #define SING 2 /* argument singularity */
1405 #define OVERFLOW 3 /* overflow range error */
1406 #define UNDERFLOW 4 /* underflow range error */
1407 #define TLOSS 5 /* total loss of precision */
1408 #define PLOSS 6 /* partial loss of precision */
1409 #define INVALID 7 /* NaN-producing operation */
1411 /* e type constants used by high precision check routines */
1413 #if LONG_DOUBLE_TYPE_SIZE == 128
1415 unsigned EMUSHORT ezero
[NE
] =
1416 {0x0000, 0x0000, 0x0000, 0x0000,
1417 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,};
1418 extern unsigned EMUSHORT ezero
[];
1421 unsigned EMUSHORT ehalf
[NE
] =
1422 {0x0000, 0x0000, 0x0000, 0x0000,
1423 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3ffe,};
1424 extern unsigned EMUSHORT ehalf
[];
1427 unsigned EMUSHORT eone
[NE
] =
1428 {0x0000, 0x0000, 0x0000, 0x0000,
1429 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,};
1430 extern unsigned EMUSHORT eone
[];
1433 unsigned EMUSHORT etwo
[NE
] =
1434 {0x0000, 0x0000, 0x0000, 0x0000,
1435 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000,};
1436 extern unsigned EMUSHORT etwo
[];
1439 unsigned EMUSHORT e32
[NE
] =
1440 {0x0000, 0x0000, 0x0000, 0x0000,
1441 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4004,};
1442 extern unsigned EMUSHORT e32
[];
1444 /* 6.93147180559945309417232121458176568075500134360255E-1 */
1445 unsigned EMUSHORT elog2
[NE
] =
1446 {0x40f3, 0xf6af, 0x03f2, 0xb398,
1447 0xc9e3, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
1448 extern unsigned EMUSHORT elog2
[];
1450 /* 1.41421356237309504880168872420969807856967187537695E0 */
1451 unsigned EMUSHORT esqrt2
[NE
] =
1452 {0x1d6f, 0xbe9f, 0x754a, 0x89b3,
1453 0x597d, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
1454 extern unsigned EMUSHORT esqrt2
[];
1456 /* 3.14159265358979323846264338327950288419716939937511E0 */
1457 unsigned EMUSHORT epi
[NE
] =
1458 {0x2902, 0x1cd1, 0x80dc, 0x628b,
1459 0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
1460 extern unsigned EMUSHORT epi
[];
1463 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
1464 unsigned EMUSHORT ezero
[NE
] =
1465 {0, 0000000, 0000000, 0000000, 0000000, 0000000,};
1466 unsigned EMUSHORT ehalf
[NE
] =
1467 {0, 0000000, 0000000, 0000000, 0100000, 0x3ffe,};
1468 unsigned EMUSHORT eone
[NE
] =
1469 {0, 0000000, 0000000, 0000000, 0100000, 0x3fff,};
1470 unsigned EMUSHORT etwo
[NE
] =
1471 {0, 0000000, 0000000, 0000000, 0100000, 0040000,};
1472 unsigned EMUSHORT e32
[NE
] =
1473 {0, 0000000, 0000000, 0000000, 0100000, 0040004,};
1474 unsigned EMUSHORT elog2
[NE
] =
1475 {0xc9e4, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
1476 unsigned EMUSHORT esqrt2
[NE
] =
1477 {0x597e, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
1478 unsigned EMUSHORT epi
[NE
] =
1479 {0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
1482 /* Control register for rounding precision.
1483 This can be set to 113 (if NE=10), 80 (if NE=6), 64, 56, 53, or 24 bits. */
1488 /* Clear out entire e-type number X. */
1492 register unsigned EMUSHORT
*x
;
1496 for (i
= 0; i
< NE
; i
++)
1500 /* Move e-type number from A to B. */
1504 register unsigned EMUSHORT
*a
, *b
;
1508 for (i
= 0; i
< NE
; i
++)
1513 /* Absolute value of e-type X. */
1517 unsigned EMUSHORT x
[];
1519 /* sign is top bit of last word of external format */
1520 x
[NE
- 1] &= 0x7fff;
1523 /* Negate the e-type number X. */
1527 unsigned EMUSHORT x
[];
1530 x
[NE
- 1] ^= 0x8000; /* Toggle the sign bit */
1533 /* Return 1 if sign bit of e-type number X is nonzero, else zero. */
1537 unsigned EMUSHORT x
[];
1540 if (x
[NE
- 1] & 0x8000)
1546 /* Return 1 if e-type number X is infinity, else return zero. */
1550 unsigned EMUSHORT x
[];
1557 if ((x
[NE
- 1] & 0x7fff) == 0x7fff)
1563 /* Check if e-type number is not a number. The bit pattern is one that we
1564 defined, so we know for sure how to detect it. */
1568 unsigned EMUSHORT x
[];
1573 /* NaN has maximum exponent */
1574 if ((x
[NE
- 1] & 0x7fff) != 0x7fff)
1576 /* ... and non-zero significand field. */
1577 for (i
= 0; i
< NE
- 1; i
++)
1587 /* Fill e-type number X with infinity pattern (IEEE)
1588 or largest possible number (non-IEEE). */
1592 register unsigned EMUSHORT
*x
;
1597 for (i
= 0; i
< NE
- 1; i
++)
1601 for (i
= 0; i
< NE
- 1; i
++)
1629 /* Output an e-type NaN.
1630 This generates Intel's quiet NaN pattern for extended real.
1631 The exponent is 7fff, the leading mantissa word is c000. */
1635 register unsigned EMUSHORT
*x
;
1640 for (i
= 0; i
< NE
- 2; i
++)
1643 *x
= (sign
<< 15) | 0x7fff;
1646 /* Move in an e-type number A, converting it to exploded e-type B. */
1650 unsigned EMUSHORT
*a
, *b
;
1652 register unsigned EMUSHORT
*p
, *q
;
1656 p
= a
+ (NE
- 1); /* point to last word of external number */
1657 /* get the sign bit */
1662 /* get the exponent */
1664 *q
++ &= 0x7fff; /* delete the sign bit */
1666 if ((*(q
- 1) & 0x7fff) == 0x7fff)
1672 for (i
= 3; i
< NI
; i
++)
1678 for (i
= 2; i
< NI
; i
++)
1684 /* clear high guard word */
1686 /* move in the significand */
1687 for (i
= 0; i
< NE
- 1; i
++)
1689 /* clear low guard word */
1693 /* Move out exploded e-type number A, converting it to e type B. */
1697 unsigned EMUSHORT
*a
, *b
;
1699 register unsigned EMUSHORT
*p
, *q
;
1700 unsigned EMUSHORT i
;
1704 q
= b
+ (NE
- 1); /* point to output exponent */
1705 /* combine sign and exponent */
1708 *q
-- = *p
++ | 0x8000;
1712 if (*(p
- 1) == 0x7fff)
1717 enan (b
, eiisneg (a
));
1725 /* skip over guard word */
1727 /* move the significand */
1728 for (j
= 0; j
< NE
- 1; j
++)
1732 /* Clear out exploded e-type number XI. */
1736 register unsigned EMUSHORT
*xi
;
1740 for (i
= 0; i
< NI
; i
++)
1744 /* Clear out exploded e-type XI, but don't touch the sign. */
1748 register unsigned EMUSHORT
*xi
;
1753 for (i
= 0; i
< NI
- 1; i
++)
1757 /* Move exploded e-type number from A to B. */
1761 register unsigned EMUSHORT
*a
, *b
;
1765 for (i
= 0; i
< NI
- 1; i
++)
1767 /* clear low guard word */
1771 /* Generate exploded e-type NaN.
1772 The explicit pattern for this is maximum exponent and
1773 top two significant bits set. */
1777 unsigned EMUSHORT x
[];
1785 /* Return nonzero if exploded e-type X is a NaN. */
1789 unsigned EMUSHORT x
[];
1793 if ((x
[E
] & 0x7fff) == 0x7fff)
1795 for (i
= M
+ 1; i
< NI
; i
++)
1804 /* Return nonzero if sign of exploded e-type X is nonzero. */
1808 unsigned EMUSHORT x
[];
1814 /* Fill exploded e-type X with infinity pattern.
1815 This has maximum exponent and significand all zeros. */
1819 unsigned EMUSHORT x
[];
1826 /* Return nonzero if exploded e-type X is infinite. */
1830 unsigned EMUSHORT x
[];
1837 if ((x
[E
] & 0x7fff) == 0x7fff)
1843 /* Compare significands of numbers in internal exploded e-type format.
1844 Guard words are included in the comparison.
1852 register unsigned EMUSHORT
*a
, *b
;
1856 a
+= M
; /* skip up to significand area */
1858 for (i
= M
; i
< NI
; i
++)
1866 if (*(--a
) > *(--b
))
1872 /* Shift significand of exploded e-type X down by 1 bit. */
1876 register unsigned EMUSHORT
*x
;
1878 register unsigned EMUSHORT bits
;
1881 x
+= M
; /* point to significand area */
1884 for (i
= M
; i
< NI
; i
++)
1896 /* Shift significand of exploded e-type X up by 1 bit. */
1900 register unsigned EMUSHORT
*x
;
1902 register unsigned EMUSHORT bits
;
1908 for (i
= M
; i
< NI
; i
++)
1921 /* Shift significand of exploded e-type X down by 8 bits. */
1925 register unsigned EMUSHORT
*x
;
1927 register unsigned EMUSHORT newbyt
, oldbyt
;
1932 for (i
= M
; i
< NI
; i
++)
1942 /* Shift significand of exploded e-type X up by 8 bits. */
1946 register unsigned EMUSHORT
*x
;
1949 register unsigned EMUSHORT newbyt
, oldbyt
;
1954 for (i
= M
; i
< NI
; i
++)
1964 /* Shift significand of exploded e-type X up by 16 bits. */
1968 register unsigned EMUSHORT
*x
;
1971 register unsigned EMUSHORT
*p
;
1976 for (i
= M
; i
< NI
- 1; i
++)
1982 /* Shift significand of exploded e-type X down by 16 bits. */
1986 register unsigned EMUSHORT
*x
;
1989 register unsigned EMUSHORT
*p
;
1994 for (i
= M
; i
< NI
- 1; i
++)
2000 /* Add significands of exploded e-type X and Y. X + Y replaces Y. */
2004 unsigned EMUSHORT
*x
, *y
;
2006 register unsigned EMULONG a
;
2013 for (i
= M
; i
< NI
; i
++)
2015 a
= (unsigned EMULONG
) (*x
) + (unsigned EMULONG
) (*y
) + carry
;
2020 *y
= (unsigned EMUSHORT
) a
;
2026 /* Subtract significands of exploded e-type X and Y. Y - X replaces Y. */
2030 unsigned EMUSHORT
*x
, *y
;
2039 for (i
= M
; i
< NI
; i
++)
2041 a
= (unsigned EMULONG
) (*y
) - (unsigned EMULONG
) (*x
) - carry
;
2046 *y
= (unsigned EMUSHORT
) a
;
2053 static unsigned EMUSHORT equot
[NI
];
2057 /* Radix 2 shift-and-add versions of multiply and divide */
2060 /* Divide significands */
2064 unsigned EMUSHORT den
[], num
[];
2067 register unsigned EMUSHORT
*p
, *q
;
2068 unsigned EMUSHORT j
;
2074 for (i
= M
; i
< NI
; i
++)
2079 /* Use faster compare and subtraction if denominator has only 15 bits of
2085 for (i
= M
+ 3; i
< NI
; i
++)
2090 if ((den
[M
+ 1] & 1) != 0)
2098 for (i
= 0; i
< NBITS
+ 2; i
++)
2116 /* The number of quotient bits to calculate is NBITS + 1 scaling guard
2117 bit + 1 roundoff bit. */
2122 for (i
= 0; i
< NBITS
+ 2; i
++)
2124 if (ecmpm (den
, num
) <= 0)
2127 j
= 1; /* quotient bit = 1 */
2141 /* test for nonzero remainder after roundoff bit */
2144 for (i
= M
; i
< NI
; i
++)
2152 for (i
= 0; i
< NI
; i
++)
2158 /* Multiply significands */
2162 unsigned EMUSHORT a
[], b
[];
2164 unsigned EMUSHORT
*p
, *q
;
2169 for (i
= M
; i
< NI
; i
++)
2174 while (*p
== 0) /* significand is not supposed to be zero */
2179 if ((*p
& 0xff) == 0)
2187 for (i
= 0; i
< k
; i
++)
2191 /* remember if there were any nonzero bits shifted out */
2198 for (i
= 0; i
< NI
; i
++)
2201 /* return flag for lost nonzero bits */
2207 /* Radix 65536 versions of multiply and divide. */
2209 /* Multiply significand of e-type number B
2210 by 16-bit quantity A, return e-type result to C. */
2215 unsigned EMUSHORT b
[], c
[];
2217 register unsigned EMUSHORT
*pp
;
2218 register unsigned EMULONG carry
;
2219 unsigned EMUSHORT
*ps
;
2220 unsigned EMUSHORT p
[NI
];
2221 unsigned EMULONG aa
, m
;
2230 for (i
=M
+1; i
<NI
; i
++)
2240 m
= (unsigned EMULONG
) aa
* *ps
--;
2241 carry
= (m
& 0xffff) + *pp
;
2242 *pp
-- = (unsigned EMUSHORT
)carry
;
2243 carry
= (carry
>> 16) + (m
>> 16) + *pp
;
2244 *pp
= (unsigned EMUSHORT
)carry
;
2245 *(pp
-1) = carry
>> 16;
2248 for (i
=M
; i
<NI
; i
++)
2252 /* Divide significands of exploded e-types NUM / DEN. Neither the
2253 numerator NUM nor the denominator DEN is permitted to have its high guard
2258 unsigned EMUSHORT den
[], num
[];
2261 register unsigned EMUSHORT
*p
;
2262 unsigned EMULONG tnum
;
2263 unsigned EMUSHORT j
, tdenm
, tquot
;
2264 unsigned EMUSHORT tprod
[NI
+1];
2270 for (i
=M
; i
<NI
; i
++)
2276 for (i
=M
; i
<NI
; i
++)
2278 /* Find trial quotient digit (the radix is 65536). */
2279 tnum
= (((unsigned EMULONG
) num
[M
]) << 16) + num
[M
+1];
2281 /* Do not execute the divide instruction if it will overflow. */
2282 if ((tdenm
* 0xffffL
) < tnum
)
2285 tquot
= tnum
/ tdenm
;
2286 /* Multiply denominator by trial quotient digit. */
2287 m16m ((unsigned int)tquot
, den
, tprod
);
2288 /* The quotient digit may have been overestimated. */
2289 if (ecmpm (tprod
, num
) > 0)
2293 if (ecmpm (tprod
, num
) > 0)
2303 /* test for nonzero remainder after roundoff bit */
2306 for (i
=M
; i
<NI
; i
++)
2313 for (i
=0; i
<NI
; i
++)
2319 /* Multiply significands of exploded e-type A and B, result in B. */
2323 unsigned EMUSHORT a
[], b
[];
2325 unsigned EMUSHORT
*p
, *q
;
2326 unsigned EMUSHORT pprod
[NI
];
2327 unsigned EMUSHORT j
;
2332 for (i
=M
; i
<NI
; i
++)
2338 for (i
=M
+1; i
<NI
; i
++)
2346 m16m ((unsigned int) *p
--, b
, pprod
);
2347 eaddm(pprod
, equot
);
2353 for (i
=0; i
<NI
; i
++)
2356 /* return flag for lost nonzero bits */
2362 /* Normalize and round off.
2364 The internal format number to be rounded is S.
2365 Input LOST is 0 if the value is exact. This is the so-called sticky bit.
2367 Input SUBFLG indicates whether the number was obtained
2368 by a subtraction operation. In that case if LOST is nonzero
2369 then the number is slightly smaller than indicated.
2371 Input EXP is the biased exponent, which may be negative.
2372 the exponent field of S is ignored but is replaced by
2373 EXP as adjusted by normalization and rounding.
2375 Input RCNTRL is the rounding control. If it is nonzero, the
2376 returned value will be rounded to RNDPRC bits.
2378 For future reference: In order for emdnorm to round off denormal
2379 significands at the right point, the input exponent must be
2380 adjusted to be the actual value it would have after conversion to
2381 the final floating point type. This adjustment has been
2382 implemented for all type conversions (etoe53, etc.) and decimal
2383 conversions, but not for the arithmetic functions (eadd, etc.).
2384 Data types having standard 15-bit exponents are not affected by
2385 this, but SFmode and DFmode are affected. For example, ediv with
2386 rndprc = 24 will not round correctly to 24-bit precision if the
2387 result is denormal. */
2389 static int rlast
= -1;
2391 static unsigned EMUSHORT rmsk
= 0;
2392 static unsigned EMUSHORT rmbit
= 0;
2393 static unsigned EMUSHORT rebit
= 0;
2395 static unsigned EMUSHORT rbit
[NI
];
2398 emdnorm (s
, lost
, subflg
, exp
, rcntrl
)
2399 unsigned EMUSHORT s
[];
2406 unsigned EMUSHORT r
;
2411 /* a blank significand could mean either zero or infinity. */
2424 if ((j
> NBITS
) && (exp
< 32767))
2432 if (exp
> (EMULONG
) (-NBITS
- 1))
2445 /* Round off, unless told not to by rcntrl. */
2448 /* Set up rounding parameters if the control register changed. */
2449 if (rndprc
!= rlast
)
2456 rw
= NI
- 1; /* low guard word */
2476 /* For DEC or IBM arithmetic */
2503 /* Shift down 1 temporarily if the data structure has an implied
2504 most significant bit and the number is denormal.
2505 Intel long double denormals also lose one bit of precision. */
2506 if ((exp
<= 0) && (rndprc
!= NBITS
)
2507 && ((rndprc
!= 64) || ((rndprc
== 64) && ! REAL_WORDS_BIG_ENDIAN
)))
2509 lost
|= s
[NI
- 1] & 1;
2512 /* Clear out all bits below the rounding bit,
2513 remembering in r if any were nonzero. */
2527 if ((r
& rmbit
) != 0)
2532 { /* round to even */
2533 if ((s
[re
] & rebit
) == 0)
2545 /* Undo the temporary shift for denormal values. */
2546 if ((exp
<= 0) && (rndprc
!= NBITS
)
2547 && ((rndprc
!= 64) || ((rndprc
== 64) && ! REAL_WORDS_BIG_ENDIAN
)))
2552 { /* overflow on roundoff */
2565 for (i
= 2; i
< NI
- 1; i
++)
2568 warning ("floating point overflow");
2572 for (i
= M
+ 1; i
< NI
- 1; i
++)
2575 if ((rndprc
< 64) || (rndprc
== 113))
2590 s
[1] = (unsigned EMUSHORT
) exp
;
2593 /* Subtract. C = B - A, all e type numbers. */
2595 static int subflg
= 0;
2599 unsigned EMUSHORT
*a
, *b
, *c
;
2613 /* Infinity minus infinity is a NaN.
2614 Test for subtracting infinities of the same sign. */
2615 if (eisinf (a
) && eisinf (b
)
2616 && ((eisneg (a
) ^ eisneg (b
)) == 0))
2618 mtherr ("esub", INVALID
);
2627 /* Add. C = A + B, all e type. */
2631 unsigned EMUSHORT
*a
, *b
, *c
;
2635 /* NaN plus anything is a NaN. */
2646 /* Infinity minus infinity is a NaN.
2647 Test for adding infinities of opposite signs. */
2648 if (eisinf (a
) && eisinf (b
)
2649 && ((eisneg (a
) ^ eisneg (b
)) != 0))
2651 mtherr ("esub", INVALID
);
2660 /* Arithmetic common to both addition and subtraction. */
2664 unsigned EMUSHORT
*a
, *b
, *c
;
2666 unsigned EMUSHORT ai
[NI
], bi
[NI
], ci
[NI
];
2668 EMULONG lt
, lta
, ltb
;
2689 /* compare exponents */
2694 { /* put the larger number in bi */
2704 if (lt
< (EMULONG
) (-NBITS
- 1))
2705 goto done
; /* answer same as larger addend */
2707 lost
= eshift (ai
, k
); /* shift the smaller number down */
2711 /* exponents were the same, so must compare significands */
2714 { /* the numbers are identical in magnitude */
2715 /* if different signs, result is zero */
2721 /* if same sign, result is double */
2722 /* double denormalized tiny number */
2723 if ((bi
[E
] == 0) && ((bi
[3] & 0x8000) == 0))
2728 /* add 1 to exponent unless both are zero! */
2729 for (j
= 1; j
< NI
- 1; j
++)
2745 bi
[E
] = (unsigned EMUSHORT
) ltb
;
2749 { /* put the larger number in bi */
2765 emdnorm (bi
, lost
, subflg
, ltb
, 64);
2771 /* Divide: C = B/A, all e type. */
2775 unsigned EMUSHORT
*a
, *b
, *c
;
2777 unsigned EMUSHORT ai
[NI
], bi
[NI
];
2779 EMULONG lt
, lta
, ltb
;
2781 /* IEEE says if result is not a NaN, the sign is "-" if and only if
2782 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
2783 sign
= eisneg(a
) ^ eisneg(b
);
2786 /* Return any NaN input. */
2797 /* Zero over zero, or infinity over infinity, is a NaN. */
2798 if (((ecmp (a
, ezero
) == 0) && (ecmp (b
, ezero
) == 0))
2799 || (eisinf (a
) && eisinf (b
)))
2801 mtherr ("ediv", INVALID
);
2806 /* Infinity over anything else is infinity. */
2813 /* Anything else over infinity is zero. */
2825 { /* See if numerator is zero. */
2826 for (i
= 1; i
< NI
- 1; i
++)
2830 ltb
-= enormlz (bi
);
2840 { /* possible divide by zero */
2841 for (i
= 1; i
< NI
- 1; i
++)
2845 lta
-= enormlz (ai
);
2849 /* Divide by zero is not an invalid operation.
2850 It is a divide-by-zero operation! */
2852 mtherr ("ediv", SING
);
2858 /* calculate exponent */
2859 lt
= ltb
- lta
+ EXONE
;
2860 emdnorm (bi
, i
, 0, lt
, 64);
2867 && (ecmp (c
, ezero
) != 0)
2870 *(c
+(NE
-1)) |= 0x8000;
2872 *(c
+(NE
-1)) &= ~0x8000;
2875 /* Multiply e-types A and B, return e-type product C. */
2879 unsigned EMUSHORT
*a
, *b
, *c
;
2881 unsigned EMUSHORT ai
[NI
], bi
[NI
];
2883 EMULONG lt
, lta
, ltb
;
2885 /* IEEE says if result is not a NaN, the sign is "-" if and only if
2886 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
2887 sign
= eisneg(a
) ^ eisneg(b
);
2890 /* NaN times anything is the same NaN. */
2901 /* Zero times infinity is a NaN. */
2902 if ((eisinf (a
) && (ecmp (b
, ezero
) == 0))
2903 || (eisinf (b
) && (ecmp (a
, ezero
) == 0)))
2905 mtherr ("emul", INVALID
);
2910 /* Infinity times anything else is infinity. */
2912 if (eisinf (a
) || eisinf (b
))
2924 for (i
= 1; i
< NI
- 1; i
++)
2928 lta
-= enormlz (ai
);
2939 for (i
= 1; i
< NI
- 1; i
++)
2943 ltb
-= enormlz (bi
);
2952 /* Multiply significands */
2954 /* calculate exponent */
2955 lt
= lta
+ ltb
- (EXONE
- 1);
2956 emdnorm (bi
, j
, 0, lt
, 64);
2963 && (ecmp (c
, ezero
) != 0)
2966 *(c
+(NE
-1)) |= 0x8000;
2968 *(c
+(NE
-1)) &= ~0x8000;
2971 /* Convert double precision PE to e-type Y. */
2975 unsigned EMUSHORT
*pe
, *y
;
2984 ibmtoe (pe
, y
, DFmode
);
2987 register unsigned EMUSHORT r
;
2988 register unsigned EMUSHORT
*e
, *p
;
2989 unsigned EMUSHORT yy
[NI
];
2993 denorm
= 0; /* flag if denormalized number */
2995 if (! REAL_WORDS_BIG_ENDIAN
)
3001 yy
[M
] = (r
& 0x0f) | 0x10;
3002 r
&= ~0x800f; /* strip sign and 4 significand bits */
3007 if (! REAL_WORDS_BIG_ENDIAN
)
3009 if (((pe
[3] & 0xf) != 0) || (pe
[2] != 0)
3010 || (pe
[1] != 0) || (pe
[0] != 0))
3012 enan (y
, yy
[0] != 0);
3018 if (((pe
[0] & 0xf) != 0) || (pe
[1] != 0)
3019 || (pe
[2] != 0) || (pe
[3] != 0))
3021 enan (y
, yy
[0] != 0);
3032 #endif /* INFINITY */
3034 /* If zero exponent, then the significand is denormalized.
3035 So take back the understood high significand bit. */
3046 if (! REAL_WORDS_BIG_ENDIAN
)
3062 { /* if zero exponent, then normalize the significand */
3063 if ((k
= enormlz (yy
)) > NBITS
)
3066 yy
[E
] -= (unsigned EMUSHORT
) (k
- 1);
3069 #endif /* not IBM */
3070 #endif /* not DEC */
3073 /* Convert double extended precision float PE to e type Y. */
3077 unsigned EMUSHORT
*pe
, *y
;
3079 unsigned EMUSHORT yy
[NI
];
3080 unsigned EMUSHORT
*e
, *p
, *q
;
3085 for (i
= 0; i
< NE
- 5; i
++)
3087 /* This precision is not ordinarily supported on DEC or IBM. */
3089 for (i
= 0; i
< 5; i
++)
3093 p
= &yy
[0] + (NE
- 1);
3096 for (i
= 0; i
< 5; i
++)
3100 if (! REAL_WORDS_BIG_ENDIAN
)
3102 for (i
= 0; i
< 5; i
++)
3105 /* For denormal long double Intel format, shift significand up one
3106 -- but only if the top significand bit is zero. A top bit of 1
3107 is "pseudodenormal" when the exponent is zero. */
3108 if((yy
[NE
-1] & 0x7fff) == 0 && (yy
[NE
-2] & 0x8000) == 0)
3110 unsigned EMUSHORT temp
[NI
];
3120 p
= &yy
[0] + (NE
- 1);
3121 #ifdef ARM_EXTENDED_IEEE_FORMAT
3122 /* For ARMs, the exponent is in the lowest 15 bits of the word. */
3123 *p
-- = (e
[0] & 0x8000) | (e
[1] & 0x7ffff);
3129 for (i
= 0; i
< 4; i
++)
3134 /* Point to the exponent field and check max exponent cases. */
3136 if ((*p
& 0x7fff) == 0x7fff)
3139 if (! REAL_WORDS_BIG_ENDIAN
)
3141 for (i
= 0; i
< 4; i
++)
3143 if ((i
!= 3 && pe
[i
] != 0)
3144 /* Anything but 0x8000 here, including 0, is a NaN. */
3145 || (i
== 3 && pe
[i
] != 0x8000))
3147 enan (y
, (*p
& 0x8000) != 0);
3154 #ifdef ARM_EXTENDED_IEEE_FORMAT
3155 for (i
= 2; i
<= 5; i
++)
3159 enan (y
, (*p
& 0x8000) != 0);
3164 /* In Motorola extended precision format, the most significant
3165 bit of an infinity mantissa could be either 1 or 0. It is
3166 the lower order bits that tell whether the value is a NaN. */
3167 if ((pe
[2] & 0x7fff) != 0)
3170 for (i
= 3; i
<= 5; i
++)
3175 enan (y
, (*p
& 0x8000) != 0);
3179 #endif /* not ARM */
3188 #endif /* INFINITY */
3191 for (i
= 0; i
< NE
; i
++)
3195 /* Convert 128-bit long double precision float PE to e type Y. */
3199 unsigned EMUSHORT
*pe
, *y
;
3201 register unsigned EMUSHORT r
;
3202 unsigned EMUSHORT
*e
, *p
;
3203 unsigned EMUSHORT yy
[NI
];
3210 if (! REAL_WORDS_BIG_ENDIAN
)
3222 if (! REAL_WORDS_BIG_ENDIAN
)
3224 for (i
= 0; i
< 7; i
++)
3228 enan (y
, yy
[0] != 0);
3235 for (i
= 1; i
< 8; i
++)
3239 enan (y
, yy
[0] != 0);
3251 #endif /* INFINITY */
3255 if (! REAL_WORDS_BIG_ENDIAN
)
3257 for (i
= 0; i
< 7; i
++)
3263 for (i
= 0; i
< 7; i
++)
3267 /* If denormal, remove the implied bit; else shift down 1. */
3280 /* Convert single precision float PE to e type Y. */
3284 unsigned EMUSHORT
*pe
, *y
;
3288 ibmtoe (pe
, y
, SFmode
);
3291 register unsigned EMUSHORT r
;
3292 register unsigned EMUSHORT
*e
, *p
;
3293 unsigned EMUSHORT yy
[NI
];
3297 denorm
= 0; /* flag if denormalized number */
3300 if (! REAL_WORDS_BIG_ENDIAN
)
3310 yy
[M
] = (r
& 0x7f) | 0200;
3311 r
&= ~0x807f; /* strip sign and 7 significand bits */
3316 if (REAL_WORDS_BIG_ENDIAN
)
3318 if (((pe
[0] & 0x7f) != 0) || (pe
[1] != 0))
3320 enan (y
, yy
[0] != 0);
3326 if (((pe
[1] & 0x7f) != 0) || (pe
[0] != 0))
3328 enan (y
, yy
[0] != 0);
3339 #endif /* INFINITY */
3341 /* If zero exponent, then the significand is denormalized.
3342 So take back the understood high significand bit. */
3355 if (! REAL_WORDS_BIG_ENDIAN
)
3365 { /* if zero exponent, then normalize the significand */
3366 if ((k
= enormlz (yy
)) > NBITS
)
3369 yy
[E
] -= (unsigned EMUSHORT
) (k
- 1);
3372 #endif /* not IBM */
3375 /* Convert e-type X to IEEE 128-bit long double format E. */
3379 unsigned EMUSHORT
*x
, *e
;
3381 unsigned EMUSHORT xi
[NI
];
3388 make_nan (e
, eisneg (x
), TFmode
);
3393 exp
= (EMULONG
) xi
[E
];
3398 /* round off to nearest or even */
3401 emdnorm (xi
, 0, 0, exp
, 64);
3407 /* Convert exploded e-type X, that has already been rounded to
3408 113-bit precision, to IEEE 128-bit long double format Y. */
3412 unsigned EMUSHORT
*a
, *b
;
3414 register unsigned EMUSHORT
*p
, *q
;
3415 unsigned EMUSHORT i
;
3420 make_nan (b
, eiisneg (a
), TFmode
);
3425 if (REAL_WORDS_BIG_ENDIAN
)
3428 q
= b
+ 7; /* point to output exponent */
3430 /* If not denormal, delete the implied bit. */
3435 /* combine sign and exponent */
3437 if (REAL_WORDS_BIG_ENDIAN
)
3440 *q
++ = *p
++ | 0x8000;
3447 *q
-- = *p
++ | 0x8000;
3451 /* skip over guard word */
3453 /* move the significand */
3454 if (REAL_WORDS_BIG_ENDIAN
)
3456 for (i
= 0; i
< 7; i
++)
3461 for (i
= 0; i
< 7; i
++)
3466 /* Convert e-type X to IEEE double extended format E. */
3470 unsigned EMUSHORT
*x
, *e
;
3472 unsigned EMUSHORT xi
[NI
];
3479 make_nan (e
, eisneg (x
), XFmode
);
3484 /* adjust exponent for offset */
3485 exp
= (EMULONG
) xi
[E
];
3490 /* round off to nearest or even */
3493 emdnorm (xi
, 0, 0, exp
, 64);
3499 /* Convert exploded e-type X, that has already been rounded to
3500 64-bit precision, to IEEE double extended format Y. */
3504 unsigned EMUSHORT
*a
, *b
;
3506 register unsigned EMUSHORT
*p
, *q
;
3507 unsigned EMUSHORT i
;
3512 make_nan (b
, eiisneg (a
), XFmode
);
3516 /* Shift denormal long double Intel format significand down one bit. */
3517 if ((a
[E
] == 0) && ! REAL_WORDS_BIG_ENDIAN
)
3527 if (REAL_WORDS_BIG_ENDIAN
)
3531 q
= b
+ 4; /* point to output exponent */
3532 #if LONG_DOUBLE_TYPE_SIZE == 96
3533 /* Clear the last two bytes of 12-byte Intel format */
3539 /* combine sign and exponent */
3543 *q
++ = *p
++ | 0x8000;
3550 *q
-- = *p
++ | 0x8000;
3555 if (REAL_WORDS_BIG_ENDIAN
)
3557 #ifdef ARM_EXTENDED_IEEE_FORMAT
3558 /* The exponent is in the lowest 15 bits of the first word. */
3559 *q
++ = i
? 0x8000 : 0;
3563 *q
++ = *p
++ | 0x8000;
3572 *q
-- = *p
++ | 0x8000;
3577 /* skip over guard word */
3579 /* move the significand */
3581 for (i
= 0; i
< 4; i
++)
3585 for (i
= 0; i
< 4; i
++)
3589 if (REAL_WORDS_BIG_ENDIAN
)
3591 for (i
= 0; i
< 4; i
++)
3599 /* Intel long double infinity significand. */
3607 for (i
= 0; i
< 4; i
++)
3613 /* e type to double precision. */
3616 /* Convert e-type X to DEC-format double E. */
3620 unsigned EMUSHORT
*x
, *e
;
3622 etodec (x
, e
); /* see etodec.c */
3625 /* Convert exploded e-type X, that has already been rounded to
3626 56-bit double precision, to DEC double Y. */
3630 unsigned EMUSHORT
*x
, *y
;
3637 /* Convert e-type X to IBM 370-format double E. */
3641 unsigned EMUSHORT
*x
, *e
;
3643 etoibm (x
, e
, DFmode
);
3646 /* Convert exploded e-type X, that has already been rounded to
3647 56-bit precision, to IBM 370 double Y. */
3651 unsigned EMUSHORT
*x
, *y
;
3653 toibm (x
, y
, DFmode
);
3656 #else /* it's neither DEC nor IBM */
3658 /* Convert e-type X to IEEE double E. */
3662 unsigned EMUSHORT
*x
, *e
;
3664 unsigned EMUSHORT xi
[NI
];
3671 make_nan (e
, eisneg (x
), DFmode
);
3676 /* adjust exponent for offsets */
3677 exp
= (EMULONG
) xi
[E
] - (EXONE
- 0x3ff);
3682 /* round off to nearest or even */
3685 emdnorm (xi
, 0, 0, exp
, 64);
3691 /* Convert exploded e-type X, that has already been rounded to
3692 53-bit precision, to IEEE double Y. */
3696 unsigned EMUSHORT
*x
, *y
;
3698 unsigned EMUSHORT i
;
3699 unsigned EMUSHORT
*p
;
3704 make_nan (y
, eiisneg (x
), DFmode
);
3710 if (! REAL_WORDS_BIG_ENDIAN
)
3713 *y
= 0; /* output high order */
3715 *y
= 0x8000; /* output sign bit */
3718 if (i
>= (unsigned int) 2047)
3720 /* Saturate at largest number less than infinity. */
3723 if (! REAL_WORDS_BIG_ENDIAN
)
3737 *y
|= (unsigned EMUSHORT
) 0x7fef;
3738 if (! REAL_WORDS_BIG_ENDIAN
)
3763 i
|= *p
++ & (unsigned EMUSHORT
) 0x0f; /* *p = xi[M] */
3764 *y
|= (unsigned EMUSHORT
) i
; /* high order output already has sign bit set */
3765 if (! REAL_WORDS_BIG_ENDIAN
)
3780 #endif /* not IBM */
3781 #endif /* not DEC */
3785 /* e type to single precision. */
3788 /* Convert e-type X to IBM 370 float E. */
3792 unsigned EMUSHORT
*x
, *e
;
3794 etoibm (x
, e
, SFmode
);
3797 /* Convert exploded e-type X, that has already been rounded to
3798 float precision, to IBM 370 float Y. */
3802 unsigned EMUSHORT
*x
, *y
;
3804 toibm (x
, y
, SFmode
);
3808 /* Convert e-type X to IEEE float E. DEC float is the same as IEEE float. */
3812 unsigned EMUSHORT
*x
, *e
;
3815 unsigned EMUSHORT xi
[NI
];
3821 make_nan (e
, eisneg (x
), SFmode
);
3826 /* adjust exponent for offsets */
3827 exp
= (EMULONG
) xi
[E
] - (EXONE
- 0177);
3832 /* round off to nearest or even */
3835 emdnorm (xi
, 0, 0, exp
, 64);
3841 /* Convert exploded e-type X, that has already been rounded to
3842 float precision, to IEEE float Y. */
3846 unsigned EMUSHORT
*x
, *y
;
3848 unsigned EMUSHORT i
;
3849 unsigned EMUSHORT
*p
;
3854 make_nan (y
, eiisneg (x
), SFmode
);
3860 if (! REAL_WORDS_BIG_ENDIAN
)
3866 *y
= 0; /* output high order */
3868 *y
= 0x8000; /* output sign bit */
3871 /* Handle overflow cases. */
3875 *y
|= (unsigned EMUSHORT
) 0x7f80;
3880 if (! REAL_WORDS_BIG_ENDIAN
)
3888 #else /* no INFINITY */
3889 *y
|= (unsigned EMUSHORT
) 0x7f7f;
3894 if (! REAL_WORDS_BIG_ENDIAN
)
3905 #endif /* no INFINITY */
3917 i
|= *p
++ & (unsigned EMUSHORT
) 0x7f; /* *p = xi[M] */
3918 /* High order output already has sign bit set. */
3924 if (! REAL_WORDS_BIG_ENDIAN
)
3933 #endif /* not IBM */
3935 /* Compare two e type numbers.
3939 -2 if either a or b is a NaN. */
3943 unsigned EMUSHORT
*a
, *b
;
3945 unsigned EMUSHORT ai
[NI
], bi
[NI
];
3946 register unsigned EMUSHORT
*p
, *q
;
3951 if (eisnan (a
) || eisnan (b
))
3960 { /* the signs are different */
3962 for (i
= 1; i
< NI
- 1; i
++)
3976 /* both are the same sign */
3991 return (0); /* equality */
3995 if (*(--p
) > *(--q
))
3996 return (msign
); /* p is bigger */
3998 return (-msign
); /* p is littler */
4001 /* Find e-type nearest integer to X, as floor (X + 0.5). */
4005 unsigned EMUSHORT
*x
, *y
;
4011 /* Convert HOST_WIDE_INT LP to e type Y. */
4016 unsigned EMUSHORT
*y
;
4018 unsigned EMUSHORT yi
[NI
];
4019 unsigned HOST_WIDE_INT ll
;
4025 /* make it positive */
4026 ll
= (unsigned HOST_WIDE_INT
) (-(*lp
));
4027 yi
[0] = 0xffff; /* put correct sign in the e type number */
4031 ll
= (unsigned HOST_WIDE_INT
) (*lp
);
4033 /* move the long integer to yi significand area */
4034 #if HOST_BITS_PER_WIDE_INT == 64
4035 yi
[M
] = (unsigned EMUSHORT
) (ll
>> 48);
4036 yi
[M
+ 1] = (unsigned EMUSHORT
) (ll
>> 32);
4037 yi
[M
+ 2] = (unsigned EMUSHORT
) (ll
>> 16);
4038 yi
[M
+ 3] = (unsigned EMUSHORT
) ll
;
4039 yi
[E
] = EXONE
+ 47; /* exponent if normalize shift count were 0 */
4041 yi
[M
] = (unsigned EMUSHORT
) (ll
>> 16);
4042 yi
[M
+ 1] = (unsigned EMUSHORT
) ll
;
4043 yi
[E
] = EXONE
+ 15; /* exponent if normalize shift count were 0 */
4046 if ((k
= enormlz (yi
)) > NBITS
)/* normalize the significand */
4047 ecleaz (yi
); /* it was zero */
4049 yi
[E
] -= (unsigned EMUSHORT
) k
;/* subtract shift count from exponent */
4050 emovo (yi
, y
); /* output the answer */
4053 /* Convert unsigned HOST_WIDE_INT LP to e type Y. */
4057 unsigned HOST_WIDE_INT
*lp
;
4058 unsigned EMUSHORT
*y
;
4060 unsigned EMUSHORT yi
[NI
];
4061 unsigned HOST_WIDE_INT ll
;
4067 /* move the long integer to ayi significand area */
4068 #if HOST_BITS_PER_WIDE_INT == 64
4069 yi
[M
] = (unsigned EMUSHORT
) (ll
>> 48);
4070 yi
[M
+ 1] = (unsigned EMUSHORT
) (ll
>> 32);
4071 yi
[M
+ 2] = (unsigned EMUSHORT
) (ll
>> 16);
4072 yi
[M
+ 3] = (unsigned EMUSHORT
) ll
;
4073 yi
[E
] = EXONE
+ 47; /* exponent if normalize shift count were 0 */
4075 yi
[M
] = (unsigned EMUSHORT
) (ll
>> 16);
4076 yi
[M
+ 1] = (unsigned EMUSHORT
) ll
;
4077 yi
[E
] = EXONE
+ 15; /* exponent if normalize shift count were 0 */
4080 if ((k
= enormlz (yi
)) > NBITS
)/* normalize the significand */
4081 ecleaz (yi
); /* it was zero */
4083 yi
[E
] -= (unsigned EMUSHORT
) k
; /* subtract shift count from exponent */
4084 emovo (yi
, y
); /* output the answer */
4088 /* Find signed HOST_WIDE_INT integer I and floating point fractional
4089 part FRAC of e-type (packed internal format) floating point input X.
4090 The integer output I has the sign of the input, except that
4091 positive overflow is permitted if FIXUNS_TRUNC_LIKE_FIX_TRUNC.
4092 The output e-type fraction FRAC is the positive fractional
4097 unsigned EMUSHORT
*x
;
4099 unsigned EMUSHORT
*frac
;
4101 unsigned EMUSHORT xi
[NI
];
4103 unsigned HOST_WIDE_INT ll
;
4106 k
= (int) xi
[E
] - (EXONE
- 1);
4109 /* if exponent <= 0, integer = 0 and real output is fraction */
4114 if (k
> (HOST_BITS_PER_WIDE_INT
- 1))
4116 /* long integer overflow: output large integer
4117 and correct fraction */
4119 *i
= ((unsigned HOST_WIDE_INT
) 1) << (HOST_BITS_PER_WIDE_INT
- 1);
4122 #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC
4123 /* In this case, let it overflow and convert as if unsigned. */
4124 euifrac (x
, &ll
, frac
);
4125 *i
= (HOST_WIDE_INT
) ll
;
4128 /* In other cases, return the largest positive integer. */
4129 *i
= (((unsigned HOST_WIDE_INT
) 1) << (HOST_BITS_PER_WIDE_INT
- 1)) - 1;
4134 warning ("overflow on truncation to integer");
4138 /* Shift more than 16 bits: first shift up k-16 mod 16,
4139 then shift up by 16's. */
4140 j
= k
- ((k
>> 4) << 4);
4147 ll
= (ll
<< 16) | xi
[M
];
4149 while ((k
-= 16) > 0);
4156 /* shift not more than 16 bits */
4158 *i
= (HOST_WIDE_INT
) xi
[M
] & 0xffff;
4165 if ((k
= enormlz (xi
)) > NBITS
)
4168 xi
[E
] -= (unsigned EMUSHORT
) k
;
4174 /* Find unsigned HOST_WIDE_INT integer I and floating point fractional part
4175 FRAC of e-type X. A negative input yields integer output = 0 but
4176 correct fraction. */
4179 euifrac (x
, i
, frac
)
4180 unsigned EMUSHORT
*x
;
4181 unsigned HOST_WIDE_INT
*i
;
4182 unsigned EMUSHORT
*frac
;
4184 unsigned HOST_WIDE_INT ll
;
4185 unsigned EMUSHORT xi
[NI
];
4189 k
= (int) xi
[E
] - (EXONE
- 1);
4192 /* if exponent <= 0, integer = 0 and argument is fraction */
4197 if (k
> HOST_BITS_PER_WIDE_INT
)
4199 /* Long integer overflow: output large integer
4200 and correct fraction.
4201 Note, the BSD microvax compiler says that ~(0UL)
4202 is a syntax error. */
4206 warning ("overflow on truncation to unsigned integer");
4210 /* Shift more than 16 bits: first shift up k-16 mod 16,
4211 then shift up by 16's. */
4212 j
= k
- ((k
>> 4) << 4);
4219 ll
= (ll
<< 16) | xi
[M
];
4221 while ((k
-= 16) > 0);
4226 /* shift not more than 16 bits */
4228 *i
= (HOST_WIDE_INT
) xi
[M
] & 0xffff;
4231 if (xi
[0]) /* A negative value yields unsigned integer 0. */
4237 if ((k
= enormlz (xi
)) > NBITS
)
4240 xi
[E
] -= (unsigned EMUSHORT
) k
;
4245 /* Shift the significand of exploded e-type X up or down by SC bits. */
4249 unsigned EMUSHORT
*x
;
4252 unsigned EMUSHORT lost
;
4253 unsigned EMUSHORT
*p
;
4266 lost
|= *p
; /* remember lost bits */
4307 return ((int) lost
);
4310 /* Shift normalize the significand area of exploded e-type X.
4311 Return the shift count (up = positive). */
4315 unsigned EMUSHORT x
[];
4317 register unsigned EMUSHORT
*p
;
4326 return (0); /* already normalized */
4332 /* With guard word, there are NBITS+16 bits available.
4333 Return true if all are zero. */
4337 /* see if high byte is zero */
4338 while ((*p
& 0xff00) == 0)
4343 /* now shift 1 bit at a time */
4344 while ((*p
& 0x8000) == 0)
4350 mtherr ("enormlz", UNDERFLOW
);
4356 /* Normalize by shifting down out of the high guard word
4357 of the significand */
4372 mtherr ("enormlz", OVERFLOW
);
4379 /* Powers of ten used in decimal <-> binary conversions. */
4384 #if LONG_DOUBLE_TYPE_SIZE == 128
4385 static unsigned EMUSHORT etens
[NTEN
+ 1][NE
] =
4387 {0x6576, 0x4a92, 0x804a, 0x153f,
4388 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
4389 {0x6a32, 0xce52, 0x329a, 0x28ce,
4390 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
4391 {0x526c, 0x50ce, 0xf18b, 0x3d28,
4392 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
4393 {0x9c66, 0x58f8, 0xbc50, 0x5c54,
4394 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
4395 {0x851e, 0xeab7, 0x98fe, 0x901b,
4396 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
4397 {0x0235, 0x0137, 0x36b1, 0x336c,
4398 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
4399 {0x50f8, 0x25fb, 0xc76b, 0x6b71,
4400 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
4401 {0x0000, 0x0000, 0x0000, 0x0000,
4402 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
4403 {0x0000, 0x0000, 0x0000, 0x0000,
4404 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
4405 {0x0000, 0x0000, 0x0000, 0x0000,
4406 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
4407 {0x0000, 0x0000, 0x0000, 0x0000,
4408 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
4409 {0x0000, 0x0000, 0x0000, 0x0000,
4410 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
4411 {0x0000, 0x0000, 0x0000, 0x0000,
4412 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
4415 static unsigned EMUSHORT emtens
[NTEN
+ 1][NE
] =
4417 {0x2030, 0xcffc, 0xa1c3, 0x8123,
4418 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
4419 {0x8264, 0xd2cb, 0xf2ea, 0x12d4,
4420 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
4421 {0xf53f, 0xf698, 0x6bd3, 0x0158,
4422 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
4423 {0xe731, 0x04d4, 0xe3f2, 0xd332,
4424 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
4425 {0xa23e, 0x5308, 0xfefb, 0x1155,
4426 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
4427 {0xe26d, 0xdbde, 0xd05d, 0xb3f6,
4428 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
4429 {0x2a20, 0x6224, 0x47b3, 0x98d7,
4430 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
4431 {0x0b5b, 0x4af2, 0xa581, 0x18ed,
4432 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
4433 {0xbf71, 0xa9b3, 0x7989, 0xbe68,
4434 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
4435 {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b,
4436 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
4437 {0xc155, 0xa4a8, 0x404e, 0x6113,
4438 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
4439 {0xd70a, 0x70a3, 0x0a3d, 0xa3d7,
4440 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
4441 {0xcccd, 0xcccc, 0xcccc, 0xcccc,
4442 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
4445 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
4446 static unsigned EMUSHORT etens
[NTEN
+ 1][NE
] =
4448 {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
4449 {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
4450 {0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
4451 {0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
4452 {0xddbc, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
4453 {0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
4454 {0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
4455 {0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
4456 {0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
4457 {0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
4458 {0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
4459 {0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
4460 {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
4463 static unsigned EMUSHORT emtens
[NTEN
+ 1][NE
] =
4465 {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
4466 {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
4467 {0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
4468 {0x7133, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
4469 {0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
4470 {0xac7d, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
4471 {0x3f24, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
4472 {0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
4473 {0x4c2f, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
4474 {0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
4475 {0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
4476 {0x3d71, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
4477 {0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
4481 /* Convert float value X to ASCII string STRING with NDIG digits after
4482 the decimal point. */
4485 e24toasc (x
, string
, ndigs
)
4486 unsigned EMUSHORT x
[];
4490 unsigned EMUSHORT w
[NI
];
4493 etoasc (w
, string
, ndigs
);
4496 /* Convert double value X to ASCII string STRING with NDIG digits after
4497 the decimal point. */
4500 e53toasc (x
, string
, ndigs
)
4501 unsigned EMUSHORT x
[];
4505 unsigned EMUSHORT w
[NI
];
4508 etoasc (w
, string
, ndigs
);
4511 /* Convert double extended value X to ASCII string STRING with NDIG digits
4512 after the decimal point. */
4515 e64toasc (x
, string
, ndigs
)
4516 unsigned EMUSHORT x
[];
4520 unsigned EMUSHORT w
[NI
];
4523 etoasc (w
, string
, ndigs
);
4526 /* Convert 128-bit long double value X to ASCII string STRING with NDIG digits
4527 after the decimal point. */
4530 e113toasc (x
, string
, ndigs
)
4531 unsigned EMUSHORT x
[];
4535 unsigned EMUSHORT w
[NI
];
4538 etoasc (w
, string
, ndigs
);
4541 /* Convert e-type X to ASCII string STRING with NDIGS digits after
4542 the decimal point. */
4544 static char wstring
[80]; /* working storage for ASCII output */
4547 etoasc (x
, string
, ndigs
)
4548 unsigned EMUSHORT x
[];
4553 unsigned EMUSHORT y
[NI
], t
[NI
], u
[NI
], w
[NI
];
4554 unsigned EMUSHORT
*p
, *r
, *ten
;
4555 unsigned EMUSHORT sign
;
4556 int i
, j
, k
, expon
, rndsav
;
4558 unsigned EMUSHORT m
;
4569 sprintf (wstring
, " NaN ");
4573 rndprc
= NBITS
; /* set to full precision */
4574 emov (x
, y
); /* retain external format */
4575 if (y
[NE
- 1] & 0x8000)
4578 y
[NE
- 1] &= 0x7fff;
4585 ten
= &etens
[NTEN
][0];
4587 /* Test for zero exponent */
4590 for (k
= 0; k
< NE
- 1; k
++)
4593 goto tnzro
; /* denormalized number */
4595 goto isone
; /* valid all zeros */
4599 /* Test for infinity. */
4600 if (y
[NE
- 1] == 0x7fff)
4603 sprintf (wstring
, " -Infinity ");
4605 sprintf (wstring
, " Infinity ");
4609 /* Test for exponent nonzero but significand denormalized.
4610 * This is an error condition.
4612 if ((y
[NE
- 1] != 0) && ((y
[NE
- 2] & 0x8000) == 0))
4614 mtherr ("etoasc", DOMAIN
);
4615 sprintf (wstring
, "NaN");
4619 /* Compare to 1.0 */
4628 { /* Number is greater than 1 */
4629 /* Convert significand to an integer and strip trailing decimal zeros. */
4631 u
[NE
- 1] = EXONE
+ NBITS
- 1;
4633 p
= &etens
[NTEN
- 4][0];
4639 for (j
= 0; j
< NE
- 1; j
++)
4652 /* Rescale from integer significand */
4653 u
[NE
- 1] += y
[NE
- 1] - (unsigned int) (EXONE
+ NBITS
- 1);
4655 /* Find power of 10 */
4659 /* An unordered compare result shouldn't happen here. */
4660 while (ecmp (ten
, u
) <= 0)
4662 if (ecmp (p
, u
) <= 0)
4675 { /* Number is less than 1.0 */
4676 /* Pad significand with trailing decimal zeros. */
4679 while ((y
[NE
- 2] & 0x8000) == 0)
4688 for (i
= 0; i
< NDEC
+ 1; i
++)
4690 if ((w
[NI
- 1] & 0x7) != 0)
4692 /* multiply by 10 */
4705 if (eone
[NE
- 1] <= u
[1])
4717 while (ecmp (eone
, w
) > 0)
4719 if (ecmp (p
, w
) >= 0)
4734 /* Find the first (leading) digit. */
4740 digit
= equot
[NI
- 1];
4741 while ((digit
== 0) && (ecmp (y
, ezero
) != 0))
4749 digit
= equot
[NI
- 1];
4757 /* Examine number of digits requested by caller. */
4775 *s
++ = (char)digit
+ '0';
4778 /* Generate digits after the decimal point. */
4779 for (k
= 0; k
<= ndigs
; k
++)
4781 /* multiply current number by 10, without normalizing */
4788 *s
++ = (char) equot
[NI
- 1] + '0';
4790 digit
= equot
[NI
- 1];
4793 /* round off the ASCII string */
4796 /* Test for critical rounding case in ASCII output. */
4800 if (ecmp (t
, ezero
) != 0)
4801 goto roun
; /* round to nearest */
4802 if ((*(s
- 1) & 1) == 0)
4803 goto doexp
; /* round to even */
4805 /* Round up and propagate carry-outs */
4809 /* Carry out to most significant digit? */
4816 /* Most significant digit carries to 10? */
4824 /* Round up and carry out from less significant digits */
4836 sprintf (ss, "e+%d", expon);
4838 sprintf (ss, "e%d", expon);
4840 sprintf (ss
, "e%d", expon
);
4843 /* copy out the working string */
4846 while (*ss
== ' ') /* strip possible leading space */
4848 while ((*s
++ = *ss
++) != '\0')
4853 /* Convert ASCII string to floating point.
4855 Numeric input is a free format decimal number of any length, with
4856 or without decimal point. Entering E after the number followed by an
4857 integer number causes the second number to be interpreted as a power of
4858 10 to be multiplied by the first number (i.e., "scientific" notation). */
4860 /* Convert ASCII string S to single precision float value Y. */
4865 unsigned EMUSHORT
*y
;
4871 /* Convert ASCII string S to double precision value Y. */
4876 unsigned EMUSHORT
*y
;
4878 #if defined(DEC) || defined(IBM)
4886 /* Convert ASCII string S to double extended value Y. */
4891 unsigned EMUSHORT
*y
;
4896 /* Convert ASCII string S to 128-bit long double Y. */
4901 unsigned EMUSHORT
*y
;
4903 asctoeg (s
, y
, 113);
4906 /* Convert ASCII string S to e type Y. */
4911 unsigned EMUSHORT
*y
;
4913 asctoeg (s
, y
, NBITS
);
4916 /* Convert ASCII string SS to e type Y, with a specified rounding precision
4920 asctoeg (ss
, y
, oprec
)
4922 unsigned EMUSHORT
*y
;
4925 unsigned EMUSHORT yy
[NI
], xt
[NI
], tt
[NI
];
4926 int esign
, decflg
, sgnflg
, nexp
, exp
, prec
, lost
;
4927 int k
, trail
, c
, rndsav
;
4929 unsigned EMUSHORT nsign
, *p
;
4930 char *sp
, *s
, *lstr
;
4932 /* Copy the input string. */
4933 lstr
= (char *) alloca (strlen (ss
) + 1);
4935 while (*s
== ' ') /* skip leading spaces */
4938 while ((*sp
++ = *s
++) != '\0')
4943 rndprc
= NBITS
; /* Set to full precision */
4956 if ((k
>= 0) && (k
<= 9))
4958 /* Ignore leading zeros */
4959 if ((prec
== 0) && (decflg
== 0) && (k
== 0))
4961 /* Identify and strip trailing zeros after the decimal point. */
4962 if ((trail
== 0) && (decflg
!= 0))
4965 while ((*sp
>= '0') && (*sp
<= '9'))
4967 /* Check for syntax error */
4969 if ((c
!= 'e') && (c
!= 'E') && (c
!= '\0')
4970 && (c
!= '\n') && (c
!= '\r') && (c
!= ' ')
4981 /* If enough digits were given to more than fill up the yy register,
4982 continuing until overflow into the high guard word yy[2]
4983 guarantees that there will be a roundoff bit at the top
4984 of the low guard word after normalization. */
4989 nexp
+= 1; /* count digits after decimal point */
4990 eshup1 (yy
); /* multiply current number by 10 */
4996 xt
[NI
- 2] = (unsigned EMUSHORT
) k
;
5001 /* Mark any lost non-zero digit. */
5003 /* Count lost digits before the decimal point. */
5018 case '.': /* decimal point */
5048 mtherr ("asctoe", DOMAIN
);
5057 /* Exponent interpretation */
5059 /* 0.0eXXX is zero, regardless of XXX. Check for the 0.0. */
5060 for (k
= 0; k
< NI
; k
++)
5071 /* check for + or - */
5079 while ((*s
>= '0') && (*s
<= '9'))
5083 if (exp
> -(MINDECEXP
))
5093 if (exp
> MAXDECEXP
)
5097 yy
[E
] = 0x7fff; /* infinity */
5100 if (exp
< MINDECEXP
)
5109 /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
5110 while ((nexp
> 0) && (yy
[2] == 0))
5122 if ((k
= enormlz (yy
)) > NBITS
)
5127 lexp
= (EXONE
- 1 + NBITS
) - k
;
5128 emdnorm (yy
, lost
, 0, lexp
, 64);
5130 /* Convert to external format:
5132 Multiply by 10**nexp. If precision is 64 bits,
5133 the maximum relative error incurred in forming 10**n
5134 for 0 <= n <= 324 is 8.2e-20, at 10**180.
5135 For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
5136 For 0 >= n >= -999, it is -1.55e-19 at 10**-435. */
5151 /* Punt. Can't handle this without 2 divides. */
5152 emovi (etens
[0], tt
);
5159 p
= &etens
[NTEN
][0];
5169 while (exp
<= MAXP
);
5187 /* Round and convert directly to the destination type */
5189 lexp
-= EXONE
- 0x3ff;
5191 else if (oprec
== 24 || oprec
== 56)
5192 lexp
-= EXONE
- (0x41 << 2);
5194 else if (oprec
== 24)
5195 lexp
-= EXONE
- 0177;
5198 else if (oprec
== 56)
5199 lexp
-= EXONE
- 0201;
5202 emdnorm (yy
, k
, 0, lexp
, 64);
5212 todec (yy
, y
); /* see etodec.c */
5217 toibm (yy
, y
, DFmode
);
5240 /* Return Y = largest integer not greater than X (truncated toward minus
5243 static unsigned EMUSHORT bmask
[] =
5266 unsigned EMUSHORT x
[], y
[];
5268 register unsigned EMUSHORT
*p
;
5270 unsigned EMUSHORT f
[NE
];
5272 emov (x
, f
); /* leave in external format */
5273 expon
= (int) f
[NE
- 1];
5274 e
= (expon
& 0x7fff) - (EXONE
- 1);
5280 /* number of bits to clear out */
5292 /* clear the remaining bits */
5294 /* truncate negatives toward minus infinity */
5297 if ((unsigned EMUSHORT
) expon
& (unsigned EMUSHORT
) 0x8000)
5299 for (i
= 0; i
< NE
- 1; i
++)
5311 /* Return S and EXP such that S * 2^EXP = X and .5 <= S < 1.
5312 For example, 1.1 = 0.55 * 2^1. */
5316 unsigned EMUSHORT x
[];
5318 unsigned EMUSHORT s
[];
5320 unsigned EMUSHORT xi
[NI
];
5324 /* Handle denormalized numbers properly using long integer exponent. */
5325 li
= (EMULONG
) ((EMUSHORT
) xi
[1]);
5333 *exp
= (int) (li
- 0x3ffe);
5336 /* Return e type Y = X * 2^PWR2. */
5340 unsigned EMUSHORT x
[];
5342 unsigned EMUSHORT y
[];
5344 unsigned EMUSHORT xi
[NI
];
5352 emdnorm (xi
, i
, i
, li
, 64);
5357 /* C = remainder after dividing B by A, all e type values.
5358 Least significant integer quotient bits left in EQUOT. */
5362 unsigned EMUSHORT a
[], b
[], c
[];
5364 unsigned EMUSHORT den
[NI
], num
[NI
];
5368 || (ecmp (a
, ezero
) == 0)
5376 if (ecmp (a
, ezero
) == 0)
5378 mtherr ("eremain", SING
);
5384 eiremain (den
, num
);
5385 /* Sign of remainder = sign of quotient */
5393 /* Return quotient of exploded e-types NUM / DEN in EQUOT,
5394 remainder in NUM. */
5398 unsigned EMUSHORT den
[], num
[];
5401 unsigned EMUSHORT j
;
5404 ld
-= enormlz (den
);
5406 ln
-= enormlz (num
);
5410 if (ecmpm (den
, num
) <= 0)
5422 emdnorm (num
, 0, 0, ln
, 0);
5425 /* Report an error condition CODE encountered in function NAME.
5426 CODE is one of the following:
5428 Mnemonic Value Significance
5430 DOMAIN 1 argument domain error
5431 SING 2 function singularity
5432 OVERFLOW 3 overflow range error
5433 UNDERFLOW 4 underflow range error
5434 TLOSS 5 total loss of precision
5435 PLOSS 6 partial loss of precision
5436 INVALID 7 NaN - producing operation
5437 EDOM 33 Unix domain error code
5438 ERANGE 34 Unix range error code
5440 The order of appearance of the following messages is bound to the
5441 error codes defined above. */
5444 static char *ermsg
[NMSGS
] =
5446 "unknown", /* error code 0 */
5447 "domain", /* error code 1 */
5448 "singularity", /* et seq. */
5451 "total loss of precision",
5452 "partial loss of precision",
5466 /* The string passed by the calling program is supposed to be the
5467 name of the function in which the error occurred.
5468 The code argument selects which error message string will be printed. */
5470 if ((code
<= 0) || (code
>= NMSGS
))
5472 sprintf (errstr
, " %s %s error", name
, ermsg
[code
]);
5475 /* Set global error message word */
5480 /* Convert DEC double precision D to e type E. */
5484 unsigned EMUSHORT
*d
;
5485 unsigned EMUSHORT
*e
;
5487 unsigned EMUSHORT y
[NI
];
5488 register unsigned EMUSHORT r
, *p
;
5490 ecleaz (y
); /* start with a zero */
5491 p
= y
; /* point to our number */
5492 r
= *d
; /* get DEC exponent word */
5493 if (*d
& (unsigned int) 0x8000)
5494 *p
= 0xffff; /* fill in our sign */
5495 ++p
; /* bump pointer to our exponent word */
5496 r
&= 0x7fff; /* strip the sign bit */
5497 if (r
== 0) /* answer = 0 if high order DEC word = 0 */
5501 r
>>= 7; /* shift exponent word down 7 bits */
5502 r
+= EXONE
- 0201; /* subtract DEC exponent offset */
5503 /* add our e type exponent offset */
5504 *p
++ = r
; /* to form our exponent */
5506 r
= *d
++; /* now do the high order mantissa */
5507 r
&= 0177; /* strip off the DEC exponent and sign bits */
5508 r
|= 0200; /* the DEC understood high order mantissa bit */
5509 *p
++ = r
; /* put result in our high guard word */
5511 *p
++ = *d
++; /* fill in the rest of our mantissa */
5515 eshdn8 (y
); /* shift our mantissa down 8 bits */
5520 /* Convert e type X to DEC double precision D. */
5524 unsigned EMUSHORT
*x
, *d
;
5526 unsigned EMUSHORT xi
[NI
];
5531 /* Adjust exponent for offsets. */
5532 exp
= (EMULONG
) xi
[E
] - (EXONE
- 0201);
5533 /* Round off to nearest or even. */
5536 emdnorm (xi
, 0, 0, exp
, 64);
5541 /* Convert exploded e-type X, that has already been rounded to
5542 56-bit precision, to DEC format double Y. */
5546 unsigned EMUSHORT
*x
, *y
;
5548 unsigned EMUSHORT i
;
5549 unsigned EMUSHORT
*p
;
5588 /* Convert IBM single/double precision to e type. */
5592 unsigned EMUSHORT
*d
;
5593 unsigned EMUSHORT
*e
;
5594 enum machine_mode mode
;
5596 unsigned EMUSHORT y
[NI
];
5597 register unsigned EMUSHORT r
, *p
;
5600 ecleaz (y
); /* start with a zero */
5601 p
= y
; /* point to our number */
5602 r
= *d
; /* get IBM exponent word */
5603 if (*d
& (unsigned int) 0x8000)
5604 *p
= 0xffff; /* fill in our sign */
5605 ++p
; /* bump pointer to our exponent word */
5606 r
&= 0x7f00; /* strip the sign bit */
5607 r
>>= 6; /* shift exponent word down 6 bits */
5608 /* in fact shift by 8 right and 2 left */
5609 r
+= EXONE
- (0x41 << 2); /* subtract IBM exponent offset */
5610 /* add our e type exponent offset */
5611 *p
++ = r
; /* to form our exponent */
5613 *p
++ = *d
++ & 0xff; /* now do the high order mantissa */
5614 /* strip off the IBM exponent and sign bits */
5615 if (mode
!= SFmode
) /* there are only 2 words in SFmode */
5617 *p
++ = *d
++; /* fill in the rest of our mantissa */
5622 if (y
[M
] == 0 && y
[M
+1] == 0 && y
[M
+2] == 0 && y
[M
+3] == 0)
5625 y
[E
] -= 5 + enormlz (y
); /* now normalise the mantissa */
5626 /* handle change in RADIX */
5632 /* Convert e type to IBM single/double precision. */
5636 unsigned EMUSHORT
*x
, *d
;
5637 enum machine_mode mode
;
5639 unsigned EMUSHORT xi
[NI
];
5644 exp
= (EMULONG
) xi
[E
] - (EXONE
- (0x41 << 2)); /* adjust exponent for offsets */
5645 /* round off to nearest or even */
5648 emdnorm (xi
, 0, 0, exp
, 64);
5650 toibm (xi
, d
, mode
);
5655 unsigned EMUSHORT
*x
, *y
;
5656 enum machine_mode mode
;
5658 unsigned EMUSHORT i
;
5659 unsigned EMUSHORT
*p
;
5707 /* Output a binary NaN bit pattern in the target machine's format. */
5709 /* If special NaN bit patterns are required, define them in tm.h
5710 as arrays of unsigned 16-bit shorts. Otherwise, use the default
5716 unsigned EMUSHORT TFbignan
[8] =
5717 {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
5718 unsigned EMUSHORT TFlittlenan
[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
5726 unsigned EMUSHORT XFbignan
[6] =
5727 {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
5728 unsigned EMUSHORT XFlittlenan
[6] = {0, 0, 0, 0xc000, 0xffff, 0};
5736 unsigned EMUSHORT DFbignan
[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
5737 unsigned EMUSHORT DFlittlenan
[4] = {0, 0, 0, 0xfff8};
5745 unsigned EMUSHORT SFbignan
[2] = {0x7fff, 0xffff};
5746 unsigned EMUSHORT SFlittlenan
[2] = {0, 0xffc0};
5752 make_nan (nan
, sign
, mode
)
5753 unsigned EMUSHORT
*nan
;
5755 enum machine_mode mode
;
5758 unsigned EMUSHORT
*p
;
5762 /* Possibly the `reserved operand' patterns on a VAX can be
5763 used like NaN's, but probably not in the same way as IEEE. */
5764 #if !defined(DEC) && !defined(IBM)
5767 if (REAL_WORDS_BIG_ENDIAN
)
5774 if (REAL_WORDS_BIG_ENDIAN
)
5781 if (REAL_WORDS_BIG_ENDIAN
)
5789 if (REAL_WORDS_BIG_ENDIAN
)
5798 if (REAL_WORDS_BIG_ENDIAN
)
5799 *nan
++ = (sign
<< 15) | *p
++;
5802 if (! REAL_WORDS_BIG_ENDIAN
)
5803 *nan
= (sign
<< 15) | *p
;
5806 /* This is the inverse of the function `etarsingle' invoked by
5807 REAL_VALUE_TO_TARGET_SINGLE. */
5810 ereal_unto_float (f
)
5814 unsigned EMUSHORT s
[2];
5815 unsigned EMUSHORT e
[NE
];
5817 /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
5818 This is the inverse operation to what the function `endian' does. */
5819 if (REAL_WORDS_BIG_ENDIAN
)
5821 s
[0] = (unsigned EMUSHORT
) (f
>> 16);
5822 s
[1] = (unsigned EMUSHORT
) f
;
5826 s
[0] = (unsigned EMUSHORT
) f
;
5827 s
[1] = (unsigned EMUSHORT
) (f
>> 16);
5829 /* Convert and promote the target float to E-type. */
5831 /* Output E-type to REAL_VALUE_TYPE. */
5837 /* This is the inverse of the function `etardouble' invoked by
5838 REAL_VALUE_TO_TARGET_DOUBLE. */
5841 ereal_unto_double (d
)
5845 unsigned EMUSHORT s
[4];
5846 unsigned EMUSHORT e
[NE
];
5848 /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
5849 if (REAL_WORDS_BIG_ENDIAN
)
5851 s
[0] = (unsigned EMUSHORT
) (d
[0] >> 16);
5852 s
[1] = (unsigned EMUSHORT
) d
[0];
5853 s
[2] = (unsigned EMUSHORT
) (d
[1] >> 16);
5854 s
[3] = (unsigned EMUSHORT
) d
[1];
5858 /* Target float words are little-endian. */
5859 s
[0] = (unsigned EMUSHORT
) d
[0];
5860 s
[1] = (unsigned EMUSHORT
) (d
[0] >> 16);
5861 s
[2] = (unsigned EMUSHORT
) d
[1];
5862 s
[3] = (unsigned EMUSHORT
) (d
[1] >> 16);
5864 /* Convert target double to E-type. */
5866 /* Output E-type to REAL_VALUE_TYPE. */
5872 /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
5873 This is somewhat like ereal_unto_float, but the input types
5874 for these are different. */
5877 ereal_from_float (f
)
5881 unsigned EMUSHORT s
[2];
5882 unsigned EMUSHORT e
[NE
];
5884 /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
5885 This is the inverse operation to what the function `endian' does. */
5886 if (REAL_WORDS_BIG_ENDIAN
)
5888 s
[0] = (unsigned EMUSHORT
) (f
>> 16);
5889 s
[1] = (unsigned EMUSHORT
) f
;
5893 s
[0] = (unsigned EMUSHORT
) f
;
5894 s
[1] = (unsigned EMUSHORT
) (f
>> 16);
5896 /* Convert and promote the target float to E-type. */
5898 /* Output E-type to REAL_VALUE_TYPE. */
5904 /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
5905 This is somewhat like ereal_unto_double, but the input types
5906 for these are different.
5908 The DFmode is stored as an array of HOST_WIDE_INT in the target's
5909 data format, with no holes in the bit packing. The first element
5910 of the input array holds the bits that would come first in the
5911 target computer's memory. */
5914 ereal_from_double (d
)
5918 unsigned EMUSHORT s
[4];
5919 unsigned EMUSHORT e
[NE
];
5921 /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
5922 if (REAL_WORDS_BIG_ENDIAN
)
5924 s
[0] = (unsigned EMUSHORT
) (d
[0] >> 16);
5925 s
[1] = (unsigned EMUSHORT
) d
[0];
5926 #if HOST_BITS_PER_WIDE_INT == 32
5927 s
[2] = (unsigned EMUSHORT
) (d
[1] >> 16);
5928 s
[3] = (unsigned EMUSHORT
) d
[1];
5930 /* In this case the entire target double is contained in the
5931 first array element. The second element of the input is
5933 s
[2] = (unsigned EMUSHORT
) (d
[0] >> 48);
5934 s
[3] = (unsigned EMUSHORT
) (d
[0] >> 32);
5939 /* Target float words are little-endian. */
5940 s
[0] = (unsigned EMUSHORT
) d
[0];
5941 s
[1] = (unsigned EMUSHORT
) (d
[0] >> 16);
5942 #if HOST_BITS_PER_WIDE_INT == 32
5943 s
[2] = (unsigned EMUSHORT
) d
[1];
5944 s
[3] = (unsigned EMUSHORT
) (d
[1] >> 16);
5946 s
[2] = (unsigned EMUSHORT
) (d
[0] >> 32);
5947 s
[3] = (unsigned EMUSHORT
) (d
[0] >> 48);
5950 /* Convert target double to E-type. */
5952 /* Output E-type to REAL_VALUE_TYPE. */
5958 /* Convert target computer unsigned 64-bit integer to e-type.
5959 The endian-ness of DImode follows the convention for integers,
5960 so we use WORDS_BIG_ENDIAN here, not REAL_WORDS_BIG_ENDIAN. */
5964 unsigned EMUSHORT
*di
; /* Address of the 64-bit int. */
5965 unsigned EMUSHORT
*e
;
5967 unsigned EMUSHORT yi
[NI
];
5971 if (WORDS_BIG_ENDIAN
)
5973 for (k
= M
; k
< M
+ 4; k
++)
5978 for (k
= M
+ 3; k
>= M
; k
--)
5981 yi
[E
] = EXONE
+ 47; /* exponent if normalize shift count were 0 */
5982 if ((k
= enormlz (yi
)) > NBITS
)/* normalize the significand */
5983 ecleaz (yi
); /* it was zero */
5985 yi
[E
] -= (unsigned EMUSHORT
) k
;/* subtract shift count from exponent */
5989 /* Convert target computer signed 64-bit integer to e-type. */
5993 unsigned EMUSHORT
*di
; /* Address of the 64-bit int. */
5994 unsigned EMUSHORT
*e
;
5996 unsigned EMULONG acc
;
5997 unsigned EMUSHORT yi
[NI
];
5998 unsigned EMUSHORT carry
;
6002 if (WORDS_BIG_ENDIAN
)
6004 for (k
= M
; k
< M
+ 4; k
++)
6009 for (k
= M
+ 3; k
>= M
; k
--)
6012 /* Take absolute value */
6018 for (k
= M
+ 3; k
>= M
; k
--)
6020 acc
= (unsigned EMULONG
) (~yi
[k
] & 0xffff) + carry
;
6027 yi
[E
] = EXONE
+ 47; /* exponent if normalize shift count were 0 */
6028 if ((k
= enormlz (yi
)) > NBITS
)/* normalize the significand */
6029 ecleaz (yi
); /* it was zero */
6031 yi
[E
] -= (unsigned EMUSHORT
) k
;/* subtract shift count from exponent */
6038 /* Convert e-type to unsigned 64-bit int. */
6042 unsigned EMUSHORT
*x
;
6043 unsigned EMUSHORT
*i
;
6045 unsigned EMUSHORT xi
[NI
];
6054 k
= (int) xi
[E
] - (EXONE
- 1);
6057 for (j
= 0; j
< 4; j
++)
6063 for (j
= 0; j
< 4; j
++)
6066 warning ("overflow on truncation to integer");
6071 /* Shift more than 16 bits: first shift up k-16 mod 16,
6072 then shift up by 16's. */
6073 j
= k
- ((k
>> 4) << 4);
6077 if (WORDS_BIG_ENDIAN
)
6088 if (WORDS_BIG_ENDIAN
)
6093 while ((k
-= 16) > 0);
6097 /* shift not more than 16 bits */
6102 if (WORDS_BIG_ENDIAN
)
6121 /* Convert e-type to signed 64-bit int. */
6125 unsigned EMUSHORT
*x
;
6126 unsigned EMUSHORT
*i
;
6128 unsigned EMULONG acc
;
6129 unsigned EMUSHORT xi
[NI
];
6130 unsigned EMUSHORT carry
;
6131 unsigned EMUSHORT
*isave
;
6135 k
= (int) xi
[E
] - (EXONE
- 1);
6138 for (j
= 0; j
< 4; j
++)
6144 for (j
= 0; j
< 4; j
++)
6147 warning ("overflow on truncation to integer");
6153 /* Shift more than 16 bits: first shift up k-16 mod 16,
6154 then shift up by 16's. */
6155 j
= k
- ((k
>> 4) << 4);
6159 if (WORDS_BIG_ENDIAN
)
6170 if (WORDS_BIG_ENDIAN
)
6175 while ((k
-= 16) > 0);
6179 /* shift not more than 16 bits */
6182 if (WORDS_BIG_ENDIAN
)
6198 /* Negate if negative */
6202 if (WORDS_BIG_ENDIAN
)
6204 for (k
= 0; k
< 4; k
++)
6206 acc
= (unsigned EMULONG
) (~(*isave
) & 0xffff) + carry
;
6207 if (WORDS_BIG_ENDIAN
)
6219 /* Longhand square root routine. */
6222 static int esqinited
= 0;
6223 static unsigned short sqrndbit
[NI
];
6227 unsigned EMUSHORT
*x
, *y
;
6229 unsigned EMUSHORT temp
[NI
], num
[NI
], sq
[NI
], xx
[NI
];
6231 int i
, j
, k
, n
, nlups
;
6236 sqrndbit
[NI
- 2] = 1;
6239 /* Check for arg <= 0 */
6240 i
= ecmp (x
, ezero
);
6245 mtherr ("esqrt", DOMAIN
);
6261 /* Bring in the arg and renormalize if it is denormal. */
6263 m
= (EMULONG
) xx
[1]; /* local long word exponent */
6267 /* Divide exponent by 2 */
6269 exp
= (unsigned short) ((m
/ 2) + 0x3ffe);
6271 /* Adjust if exponent odd */
6281 n
= 8; /* get 8 bits of result per inner loop */
6287 /* bring in next word of arg */
6289 num
[NI
- 1] = xx
[j
+ 3];
6290 /* Do additional bit on last outer loop, for roundoff. */
6293 for (i
= 0; i
< n
; i
++)
6295 /* Next 2 bits of arg */
6298 /* Shift up answer */
6300 /* Make trial divisor */
6301 for (k
= 0; k
< NI
; k
++)
6304 eaddm (sqrndbit
, temp
);
6305 /* Subtract and insert answer bit if it goes in */
6306 if (ecmpm (temp
, num
) <= 0)
6316 /* Adjust for extra, roundoff loop done. */
6317 exp
+= (NBITS
- 1) - rndprc
;
6319 /* Sticky bit = 1 if the remainder is nonzero. */
6321 for (i
= 3; i
< NI
; i
++)
6324 /* Renormalize and round off. */
6325 emdnorm (sq
, k
, 0, exp
, 64);
6328 #endif /* EMU_NON_COMPILE not defined */
6330 /* Return the binary precision of the significand for a given
6331 floating point mode. The mode can hold an integer value
6332 that many bits wide, without losing any bits. */
6335 significand_size (mode
)
6336 enum machine_mode mode
;
6339 /* Don't test the modes, but their sizes, lest this
6340 code won't work for BITS_PER_UNIT != 8 . */
6342 switch (GET_MODE_BITSIZE (mode
))
6348 #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
6351 #if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT
6354 #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT