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, 94-98, 1999 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. */
28 /* To enable support of XFmode extended real floating point, define
29 LONG_DOUBLE_TYPE_SIZE 96 in the tm.h file (m68k.h or i386.h).
31 To support cross compilation between IEEE, VAX and IBM floating
32 point formats, define REAL_ARITHMETIC in the tm.h file.
34 In either case the machine files (tm.h) must not contain any code
35 that tries to use host floating point arithmetic to convert
36 REAL_VALUE_TYPEs from `double' to `float', pass them to fprintf,
37 etc. In cross-compile situations a REAL_VALUE_TYPE may not
38 be intelligible to the host computer's native arithmetic.
40 The emulator defaults to the host's floating point format so that
41 its decimal conversion functions can be used if desired (see
44 The first part of this file interfaces gcc to a floating point
45 arithmetic suite that was not written with gcc in mind. Avoid
46 changing the low-level arithmetic routines unless you have suitable
47 test programs available. A special version of the PARANOIA floating
48 point arithmetic tester, modified for this purpose, can be found on
49 usc.edu: /pub/C-numanal/ieeetest.zoo. Other tests, and libraries of
50 XFmode and TFmode transcendental functions, can be obtained by ftp from
51 netlib.att.com: netlib/cephes. */
53 /* Type of computer arithmetic.
54 Only one of DEC, IBM, IEEE, C4X, or UNK should get defined.
56 `IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically
57 to big-endian IEEE floating-point data structure. This definition
58 should work in SFmode `float' type and DFmode `double' type on
59 virtually all big-endian IEEE machines. If LONG_DOUBLE_TYPE_SIZE
60 has been defined to be 96, then IEEE also invokes the particular
61 XFmode (`long double' type) data structure used by the Motorola
62 680x0 series processors.
64 `IEEE', when REAL_WORDS_BIG_ENDIAN is zero, refers generally to
65 little-endian IEEE machines. In this case, if LONG_DOUBLE_TYPE_SIZE
66 has been defined to be 96, then IEEE also invokes the particular
67 XFmode `long double' data structure used by the Intel 80x86 series
70 `DEC' refers specifically to the Digital Equipment Corp PDP-11
71 and VAX floating point data structure. This model currently
72 supports no type wider than DFmode.
74 `IBM' refers specifically to the IBM System/370 and compatible
75 floating point data structure. This model currently supports
76 no type wider than DFmode. The IBM conversions were contributed by
77 frank@atom.ansto.gov.au (Frank Crawford).
79 `C4X' refers specifically to the floating point format used on
80 Texas Instruments TMS320C3x and TMS320C4x digital signal
81 processors. This supports QFmode (32-bit float, double) and HFmode
82 (40-bit long double) where BITS_PER_BYTE is 32. Unlike IEEE
83 floats, C4x floats are not rounded to be even. The C4x conversions
84 were contributed by m.hayes@elec.canterbury.ac.nz (Michael Hayes) and
85 Haj.Ten.Brugge@net.HCC.nl (Herman ten Brugge).
87 If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
88 then `long double' and `double' are both implemented, but they
89 both mean DFmode. In this case, the software floating-point
90 support available here is activated by writing
91 #define REAL_ARITHMETIC
94 The case LONG_DOUBLE_TYPE_SIZE = 128 activates TFmode support
95 and may deactivate XFmode since `long double' is used to refer
98 The macros FLOAT_WORDS_BIG_ENDIAN, HOST_FLOAT_WORDS_BIG_ENDIAN,
99 contributed by Richard Earnshaw <Richard.Earnshaw@cl.cam.ac.uk>,
100 separate the floating point unit's endian-ness from that of
101 the integer addressing. This permits one to define a big-endian
102 FPU on a little-endian machine (e.g., ARM). An extension to
103 BYTES_BIG_ENDIAN may be required for some machines in the future.
104 These optional macros may be defined in tm.h. In real.h, they
105 default to WORDS_BIG_ENDIAN, etc., so there is no need to define
106 them for any normal host or target machine on which the floats
107 and the integers have the same endian-ness. */
110 /* The following converts gcc macros into the ones used by this file. */
112 /* REAL_ARITHMETIC defined means that macros in real.h are
113 defined to call emulator functions. */
114 #ifdef REAL_ARITHMETIC
116 #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT
117 /* PDP-11, Pro350, VAX: */
119 #else /* it's not VAX */
120 #if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT
121 /* IBM System/370 style */
123 #else /* it's also not an IBM */
124 #if TARGET_FLOAT_FORMAT == C4X_FLOAT_FORMAT
125 /* TMS320C3x/C4x style */
127 #else /* it's also not a C4X */
128 #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
130 #else /* it's not IEEE either */
131 /* UNKnown arithmetic. We don't support this and can't go on. */
132 unknown arithmetic type
134 #endif /* not IEEE */
139 #define REAL_WORDS_BIG_ENDIAN FLOAT_WORDS_BIG_ENDIAN
142 /* REAL_ARITHMETIC not defined means that the *host's* data
143 structure will be used. It may differ by endian-ness from the
144 target machine's structure and will get its ends swapped
145 accordingly (but not here). Probably only the decimal <-> binary
146 functions in this file will actually be used in this case. */
148 #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
150 #else /* it's not VAX */
151 #if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT
152 /* IBM System/370 style */
154 #else /* it's also not an IBM */
155 #if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
157 #else /* it's not IEEE either */
158 unknown arithmetic type
160 #endif /* not IEEE */
164 #define REAL_WORDS_BIG_ENDIAN HOST_FLOAT_WORDS_BIG_ENDIAN
166 #endif /* REAL_ARITHMETIC not defined */
168 /* Define INFINITY for support of infinity.
169 Define NANS for support of Not-a-Number's (NaN's). */
170 #if !defined(DEC) && !defined(IBM) && !defined(C4X)
175 /* Support of NaNs requires support of infinity. */
182 /* Find a host integer type that is at least 16 bits wide,
183 and another type at least twice whatever that size is. */
185 #if HOST_BITS_PER_CHAR >= 16
186 #define EMUSHORT char
187 #define EMUSHORT_SIZE HOST_BITS_PER_CHAR
188 #define EMULONG_SIZE (2 * HOST_BITS_PER_CHAR)
190 #if HOST_BITS_PER_SHORT >= 16
191 #define EMUSHORT short
192 #define EMUSHORT_SIZE HOST_BITS_PER_SHORT
193 #define EMULONG_SIZE (2 * HOST_BITS_PER_SHORT)
195 #if HOST_BITS_PER_INT >= 16
197 #define EMUSHORT_SIZE HOST_BITS_PER_INT
198 #define EMULONG_SIZE (2 * HOST_BITS_PER_INT)
200 #if HOST_BITS_PER_LONG >= 16
201 #define EMUSHORT long
202 #define EMUSHORT_SIZE HOST_BITS_PER_LONG
203 #define EMULONG_SIZE (2 * HOST_BITS_PER_LONG)
205 /* You will have to modify this program to have a smaller unit size. */
206 #define EMU_NON_COMPILE
212 #if HOST_BITS_PER_SHORT >= EMULONG_SIZE
213 #define EMULONG short
215 #if HOST_BITS_PER_INT >= EMULONG_SIZE
218 #if HOST_BITS_PER_LONG >= EMULONG_SIZE
221 #if HOST_BITS_PER_LONGLONG >= EMULONG_SIZE
222 #define EMULONG long long int
224 /* You will have to modify this program to have a smaller unit size. */
225 #define EMU_NON_COMPILE
232 /* The host interface doesn't work if no 16-bit size exists. */
233 #if EMUSHORT_SIZE != 16
234 #define EMU_NON_COMPILE
237 /* OK to continue compilation. */
238 #ifndef EMU_NON_COMPILE
240 /* Construct macros to translate between REAL_VALUE_TYPE and e type.
241 In GET_REAL and PUT_REAL, r and e are pointers.
242 A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations
243 in memory, with no holes. */
245 #if LONG_DOUBLE_TYPE_SIZE == 96
246 /* Number of 16 bit words in external e type format */
248 #define MAXDECEXP 4932
249 #define MINDECEXP -4956
250 #define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE)
251 #define PUT_REAL(e,r) \
253 if (2*NE < sizeof(*r)) \
254 bzero((char *)r, sizeof(*r)); \
255 bcopy ((char *) e, (char *) r, 2*NE); \
257 #else /* no XFmode */
258 #if LONG_DOUBLE_TYPE_SIZE == 128
260 #define MAXDECEXP 4932
261 #define MINDECEXP -4977
262 #define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE)
263 #define PUT_REAL(e,r) bcopy ((char *) e, (char *) r, 2*NE)
266 #define MAXDECEXP 4932
267 #define MINDECEXP -4956
268 #ifdef REAL_ARITHMETIC
269 /* Emulator uses target format internally
270 but host stores it in host endian-ness. */
272 #define GET_REAL(r,e) \
274 if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \
275 e53toe ((unsigned EMUSHORT *) (r), (e)); \
278 unsigned EMUSHORT w[4]; \
279 w[3] = ((EMUSHORT *) r)[0]; \
280 w[2] = ((EMUSHORT *) r)[1]; \
281 w[1] = ((EMUSHORT *) r)[2]; \
282 w[0] = ((EMUSHORT *) r)[3]; \
287 #define PUT_REAL(e,r) \
289 if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \
290 etoe53 ((e), (unsigned EMUSHORT *) (r)); \
293 unsigned EMUSHORT w[4]; \
295 *((EMUSHORT *) r) = w[3]; \
296 *((EMUSHORT *) r + 1) = w[2]; \
297 *((EMUSHORT *) r + 2) = w[1]; \
298 *((EMUSHORT *) r + 3) = w[0]; \
302 #else /* not REAL_ARITHMETIC */
304 /* emulator uses host format */
305 #define GET_REAL(r,e) e53toe ((unsigned EMUSHORT *) (r), (e))
306 #define PUT_REAL(e,r) etoe53 ((e), (unsigned EMUSHORT *) (r))
308 #endif /* not REAL_ARITHMETIC */
309 #endif /* not TFmode */
310 #endif /* not XFmode */
313 /* Number of 16 bit words in internal format */
316 /* Array offset to exponent */
319 /* Array offset to high guard word */
322 /* Number of bits of precision */
323 #define NBITS ((NI-4)*16)
325 /* Maximum number of decimal digits in ASCII conversion
328 #define NDEC (NBITS*8/27)
330 /* The exponent of 1.0 */
331 #define EXONE (0x3fff)
333 extern int extra_warnings;
334 extern unsigned EMUSHORT ezero[], ehalf[], eone[], etwo[];
335 extern unsigned EMUSHORT elog2[], esqrt2[];
337 static void endian PROTO((unsigned EMUSHORT *, long *,
339 static void eclear PROTO((unsigned EMUSHORT *));
340 static void emov PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
342 static void eabs PROTO((unsigned EMUSHORT *));
344 static void eneg PROTO((unsigned EMUSHORT *));
345 static int eisneg PROTO((unsigned EMUSHORT *));
346 static int eisinf PROTO((unsigned EMUSHORT *));
347 static int eisnan PROTO((unsigned EMUSHORT *));
348 static void einfin PROTO((unsigned EMUSHORT *));
349 static void enan PROTO((unsigned EMUSHORT *, int));
350 static void emovi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
351 static void emovo PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
352 static void ecleaz PROTO((unsigned EMUSHORT *));
353 static void ecleazs PROTO((unsigned EMUSHORT *));
354 static void emovz PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
355 static void einan PROTO((unsigned EMUSHORT *));
356 static int eiisnan PROTO((unsigned EMUSHORT *));
357 static int eiisneg PROTO((unsigned EMUSHORT *));
359 static void eiinfin PROTO((unsigned EMUSHORT *));
361 static int eiisinf PROTO((unsigned EMUSHORT *));
362 static int ecmpm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
363 static void eshdn1 PROTO((unsigned EMUSHORT *));
364 static void eshup1 PROTO((unsigned EMUSHORT *));
365 static void eshdn8 PROTO((unsigned EMUSHORT *));
366 static void eshup8 PROTO((unsigned EMUSHORT *));
367 static void eshup6 PROTO((unsigned EMUSHORT *));
368 static void eshdn6 PROTO((unsigned EMUSHORT *));
369 static void eaddm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
\f
370 static void esubm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
371 static void m16m PROTO((unsigned int, unsigned short *,
373 static int edivm PROTO((unsigned short *, unsigned short *));
374 static int emulm PROTO((unsigned short *, unsigned short *));
375 static void emdnorm PROTO((unsigned EMUSHORT *, int, int, EMULONG, int));
376 static void esub PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
377 unsigned EMUSHORT *));
378 static void eadd PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
379 unsigned EMUSHORT *));
380 static void eadd1 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
381 unsigned EMUSHORT *));
382 static void ediv PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
383 unsigned EMUSHORT *));
384 static void emul PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
385 unsigned EMUSHORT *));
386 static void e53toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
387 static void e64toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
388 static void e113toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
389 static void e24toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
390 static void etoe113 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
391 static void toe113 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
392 static void etoe64 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
393 static void toe64 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
394 static void etoe53 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
395 static void toe53 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
396 static void etoe24 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
397 static void toe24 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
398 static int ecmp PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
400 static void eround PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
402 static void ltoe PROTO((HOST_WIDE_INT *, unsigned EMUSHORT *));
403 static void ultoe PROTO((unsigned HOST_WIDE_INT *, unsigned EMUSHORT *));
404 static void eifrac PROTO((unsigned EMUSHORT *, HOST_WIDE_INT *,
405 unsigned EMUSHORT *));
406 static void euifrac PROTO((unsigned EMUSHORT *, unsigned HOST_WIDE_INT *,
407 unsigned EMUSHORT *));
408 static int eshift PROTO((unsigned EMUSHORT *, int));
409 static int enormlz PROTO((unsigned EMUSHORT *));
411 static void e24toasc PROTO((unsigned EMUSHORT *, char *, int));
412 static void e53toasc PROTO((unsigned EMUSHORT *, char *, int));
413 static void e64toasc PROTO((unsigned EMUSHORT *, char *, int));
414 static void e113toasc PROTO((unsigned EMUSHORT *, char *, int));
416 static void etoasc PROTO((unsigned EMUSHORT *, char *, int));
417 static void asctoe24 PROTO((char *, unsigned EMUSHORT *));
418 static void asctoe53 PROTO((char *, unsigned EMUSHORT *));
419 static void asctoe64 PROTO((char *, unsigned EMUSHORT *));
420 static void asctoe113 PROTO((char *, unsigned EMUSHORT *));
421 static void asctoe PROTO((char *, unsigned EMUSHORT *));
422 static void asctoeg PROTO((char *, unsigned EMUSHORT *, int));
423 static void efloor PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
425 static void efrexp PROTO((unsigned EMUSHORT *, int *,
426 unsigned EMUSHORT *));
428 static void eldexp PROTO((unsigned EMUSHORT *, int, unsigned EMUSHORT *));
430 static void eremain PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
431 unsigned EMUSHORT *));
433 static void eiremain PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
434 static void mtherr PROTO((char *, int));
436 static void dectoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
437 static void etodec PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
438 static void todec PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
441 static void ibmtoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
443 static void etoibm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
445 static void toibm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
449 static void c4xtoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
451 static void etoc4x PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
453 static void toc4x PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *,
456 static void make_nan PROTO((unsigned EMUSHORT *, int, enum machine_mode));
458 static void uditoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
459 static void ditoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
460 static void etoudi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
461 static void etodi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
462 static void esqrt PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *));
465 /* Copy 32-bit numbers obtained from array containing 16-bit numbers,
466 swapping ends if required, into output array of longs. The
467 result is normally passed to fprintf by the ASM_OUTPUT_ macros. */
471 unsigned EMUSHORT e[];
473 enum machine_mode mode;
477 if (REAL_WORDS_BIG_ENDIAN)
482 /* Swap halfwords in the fourth long. */
483 th = (unsigned long) e[6] & 0xffff;
484 t = (unsigned long) e[7] & 0xffff;
489 /* Swap halfwords in the third long. */
490 th = (unsigned long) e[4] & 0xffff;
491 t = (unsigned long) e[5] & 0xffff;
494 /* fall into the double case */
497 /* Swap halfwords in the second word. */
498 th = (unsigned long) e[2] & 0xffff;
499 t = (unsigned long) e[3] & 0xffff;
502 /* fall into the float case */
506 /* Swap halfwords in the first word. */
507 th = (unsigned long) e[0] & 0xffff;
508 t = (unsigned long) e[1] & 0xffff;
519 /* Pack the output array without swapping. */
524 /* Pack the fourth long. */
525 th = (unsigned long) e[7] & 0xffff;
526 t = (unsigned long) e[6] & 0xffff;
531 /* Pack the third long.
532 Each element of the input REAL_VALUE_TYPE array has 16 useful bits
534 th = (unsigned long) e[5] & 0xffff;
535 t = (unsigned long) e[4] & 0xffff;
538 /* fall into the double case */
541 /* Pack the second long */
542 th = (unsigned long) e[3] & 0xffff;
543 t = (unsigned long) e[2] & 0xffff;
546 /* fall into the float case */
550 /* Pack the first long */
551 th = (unsigned long) e[1] & 0xffff;
552 t = (unsigned long) e[0] & 0xffff;
562 /* If 32 bits is an entire word for the target, but not for the host,
563 then sign-extend on the host so that the number will look the same
564 way on the host that it would on the target. See for instance
565 simplify_unary_operation. The #if is needed to avoid compiler
568 #if HOST_BITS_PER_WIDE_INT > 32
569 if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == 32)
571 if (x[0] & ((HOST_WIDE_INT) 1 << 31))
572 x[0] |= ((HOST_WIDE_INT) (-1) << 32);
574 if (x[1] & ((HOST_WIDE_INT) 1 << 31))
575 x[1] |= ((HOST_WIDE_INT) (-1) << 32);
581 /* This is the implementation of the REAL_ARITHMETIC macro. */
584 earith (value, icode, r1, r2)
585 REAL_VALUE_TYPE *value;
590 unsigned EMUSHORT d1[NE], d2[NE], v[NE];
596 /* Return NaN input back to the caller. */
599 PUT_REAL (d1, value);
604 PUT_REAL (d2, value);
608 code = (enum tree_code) icode;
616 esub (d2, d1, v); /* d1 - d2 */
624 #ifndef REAL_INFINITY
625 if (ecmp (d2, ezero) == 0)
628 enan (v, eisneg (d1) ^ eisneg (d2));
635 ediv (d2, d1, v); /* d1/d2 */
638 case MIN_EXPR: /* min (d1,d2) */
639 if (ecmp (d1, d2) < 0)
645 case MAX_EXPR: /* max (d1,d2) */
646 if (ecmp (d1, d2) > 0)
659 /* Truncate REAL_VALUE_TYPE toward zero to signed HOST_WIDE_INT.
660 implements REAL_VALUE_RNDZINT (x) (etrunci (x)). */
666 unsigned EMUSHORT f[NE], g[NE];
682 /* Truncate REAL_VALUE_TYPE toward zero to unsigned HOST_WIDE_INT;
683 implements REAL_VALUE_UNSIGNED_RNDZINT (x) (etruncui (x)). */
689 unsigned EMUSHORT f[NE], g[NE];
691 unsigned HOST_WIDE_INT l;
705 /* This is the REAL_VALUE_ATOF function. It converts a decimal or hexadecimal
706 string to binary, rounding off as indicated by the machine_mode argument.
707 Then it promotes the rounded value to REAL_VALUE_TYPE. */
714 unsigned EMUSHORT tem[NE], e[NE];
757 /* Expansion of REAL_NEGATE. */
763 unsigned EMUSHORT e[NE];
773 /* Round real toward zero to HOST_WIDE_INT;
774 implements REAL_VALUE_FIX (x). */
780 unsigned EMUSHORT f[NE], g[NE];
787 warning ("conversion from NaN to int");
795 /* Round real toward zero to unsigned HOST_WIDE_INT
796 implements REAL_VALUE_UNSIGNED_FIX (x).
797 Negative input returns zero. */
799 unsigned HOST_WIDE_INT
803 unsigned EMUSHORT f[NE], g[NE];
804 unsigned HOST_WIDE_INT l;
810 warning ("conversion from NaN to unsigned int");
819 /* REAL_VALUE_FROM_INT macro. */
822 ereal_from_int (d, i, j, mode)
825 enum machine_mode mode;
827 unsigned EMUSHORT df[NE], dg[NE];
828 HOST_WIDE_INT low, high;
831 if (GET_MODE_CLASS (mode) != MODE_FLOAT)
838 /* complement and add 1 */
845 eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
846 ultoe ((unsigned HOST_WIDE_INT *) &high, dg);
848 ultoe ((unsigned HOST_WIDE_INT *) &low, df);
853 /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
854 Avoid double-rounding errors later by rounding off now from the
855 extra-wide internal format to the requested precision. */
856 switch (GET_MODE_BITSIZE (mode))
886 /* REAL_VALUE_FROM_UNSIGNED_INT macro. */
889 ereal_from_uint (d, i, j, mode)
891 unsigned HOST_WIDE_INT i, j;
892 enum machine_mode mode;
894 unsigned EMUSHORT df[NE], dg[NE];
895 unsigned HOST_WIDE_INT low, high;
897 if (GET_MODE_CLASS (mode) != MODE_FLOAT)
901 eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
907 /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
908 Avoid double-rounding errors later by rounding off now from the
909 extra-wide internal format to the requested precision. */
910 switch (GET_MODE_BITSIZE (mode))
940 /* REAL_VALUE_TO_INT macro. */
943 ereal_to_int (low, high, rr)
944 HOST_WIDE_INT *low, *high;
947 unsigned EMUSHORT d[NE], df[NE], dg[NE], dh[NE];
954 warning ("conversion from NaN to int");
960 /* convert positive value */
967 eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
968 ediv (df, d, dg); /* dg = d / 2^32 is the high word */
969 euifrac (dg, (unsigned HOST_WIDE_INT *) high, dh);
970 emul (df, dh, dg); /* fractional part is the low word */
971 euifrac (dg, (unsigned HOST_WIDE_INT *)low, dh);
974 /* complement and add 1 */
984 /* REAL_VALUE_LDEXP macro. */
991 unsigned EMUSHORT e[NE], y[NE];
1004 /* These routines are conditionally compiled because functions
1005 of the same names may be defined in fold-const.c. */
1007 #ifdef REAL_ARITHMETIC
1009 /* Check for infinity in a REAL_VALUE_TYPE. */
1015 unsigned EMUSHORT e[NE];
1019 return (eisinf (e));
1025 /* Check whether a REAL_VALUE_TYPE item is a NaN. */
1031 unsigned EMUSHORT e[NE];
1035 return (eisnan (e));
1042 /* Check for a negative REAL_VALUE_TYPE number.
1043 This just checks the sign bit, so that -0 counts as negative. */
1049 return ereal_isneg (x);
1052 /* Expansion of REAL_VALUE_TRUNCATE.
1053 The result is in floating point, rounded to nearest or even. */
1056 real_value_truncate (mode, arg)
1057 enum machine_mode mode;
1058 REAL_VALUE_TYPE arg;
1060 unsigned EMUSHORT e[NE], t[NE];
1106 /* If an unsupported type was requested, presume that
1107 the machine files know something useful to do with
1108 the unmodified value. */
1117 /* Try to change R into its exact multiplicative inverse in machine mode
1118 MODE. Return nonzero function value if successful. */
1121 exact_real_inverse (mode, r)
1122 enum machine_mode mode;
1125 unsigned EMUSHORT e[NE], einv[NE];
1126 REAL_VALUE_TYPE rinv;
1131 /* Test for input in range. Don't transform IEEE special values. */
1132 if (eisinf (e) || eisnan (e) || (ecmp (e, ezero) == 0))
1135 /* Test for a power of 2: all significand bits zero except the MSB.
1136 We are assuming the target has binary (or hex) arithmetic. */
1137 if (e[NE - 2] != 0x8000)
1140 for (i = 0; i < NE - 2; i++)
1146 /* Compute the inverse and truncate it to the required mode. */
1147 ediv (e, eone, einv);
1148 PUT_REAL (einv, &rinv);
1149 rinv = real_value_truncate (mode, rinv);
1151 #ifdef CHECK_FLOAT_VALUE
1152 /* This check is not redundant. It may, for example, flush
1153 a supposedly IEEE denormal value to zero. */
1155 if (CHECK_FLOAT_VALUE (mode, rinv, i))
1158 GET_REAL (&rinv, einv);
1160 /* Check the bits again, because the truncation might have
1161 generated an arbitrary saturation value on overflow. */
1162 if (einv[NE - 2] != 0x8000)
1165 for (i = 0; i < NE - 2; i++)
1171 /* Fail if the computed inverse is out of range. */
1172 if (eisinf (einv) || eisnan (einv) || (ecmp (einv, ezero) == 0))
1175 /* Output the reciprocal and return success flag. */
1179 #endif /* REAL_ARITHMETIC defined */
1181 /* Used for debugging--print the value of R in human-readable format
1190 REAL_VALUE_TO_DECIMAL (r, "%.20g", dstr);
1191 fprintf (stderr, "%s", dstr);
1195 /* The following routines convert REAL_VALUE_TYPE to the various floating
1196 point formats that are meaningful to supported computers.
1198 The results are returned in 32-bit pieces, each piece stored in a `long'.
1199 This is so they can be printed by statements like
1201 fprintf (file, "%lx, %lx", L[0], L[1]);
1203 that will work on both narrow- and wide-word host computers. */
1205 /* Convert R to a 128-bit long double precision value. The output array L
1206 contains four 32-bit pieces of the result, in the order they would appear
1214 unsigned EMUSHORT e[NE];
1218 endian (e, l, TFmode);
1221 /* Convert R to a double extended precision value. The output array L
1222 contains three 32-bit pieces of the result, in the order they would
1223 appear in memory. */
1230 unsigned EMUSHORT e[NE];
1234 endian (e, l, XFmode);
1237 /* Convert R to a double precision value. The output array L contains two
1238 32-bit pieces of the result, in the order they would appear in memory. */
1245 unsigned EMUSHORT e[NE];
1249 endian (e, l, DFmode);
1252 /* Convert R to a single precision float value stored in the least-significant
1253 bits of a `long'. */
1259 unsigned EMUSHORT e[NE];
1264 endian (e, &l, SFmode);
1268 /* Convert X to a decimal ASCII string S for output to an assembly
1269 language file. Note, there is no standard way to spell infinity or
1270 a NaN, so these values may require special treatment in the tm.h
1274 ereal_to_decimal (x, s)
1278 unsigned EMUSHORT e[NE];
1284 /* Compare X and Y. Return 1 if X > Y, 0 if X == Y, -1 if X < Y,
1285 or -2 if either is a NaN. */
1289 REAL_VALUE_TYPE x, y;
1291 unsigned EMUSHORT ex[NE], ey[NE];
1295 return (ecmp (ex, ey));
1298 /* Return 1 if the sign bit of X is set, else return 0. */
1304 unsigned EMUSHORT ex[NE];
1307 return (eisneg (ex));
1310 /* End of REAL_ARITHMETIC interface */
1313 Extended precision IEEE binary floating point arithmetic routines
1315 Numbers are stored in C language as arrays of 16-bit unsigned
1316 short integers. The arguments of the routines are pointers to
1319 External e type data structure, similar to Intel 8087 chip
1320 temporary real format but possibly with a larger significand:
1322 NE-1 significand words (least significant word first,
1323 most significant bit is normally set)
1324 exponent (value = EXONE for 1.0,
1325 top bit is the sign)
1328 Internal exploded e-type data structure of a number (a "word" is 16 bits):
1330 ei[0] sign word (0 for positive, 0xffff for negative)
1331 ei[1] biased exponent (value = EXONE for the number 1.0)
1332 ei[2] high guard word (always zero after normalization)
1334 to ei[NI-2] significand (NI-4 significand words,
1335 most significant word first,
1336 most significant bit is set)
1337 ei[NI-1] low guard word (0x8000 bit is rounding place)
1341 Routines for external format e-type numbers
1343 asctoe (string, e) ASCII string to extended double e type
1344 asctoe64 (string, &d) ASCII string to long double
1345 asctoe53 (string, &d) ASCII string to double
1346 asctoe24 (string, &f) ASCII string to single
1347 asctoeg (string, e, prec) ASCII string to specified precision
1348 e24toe (&f, e) IEEE single precision to e type
1349 e53toe (&d, e) IEEE double precision to e type
1350 e64toe (&d, e) IEEE long double precision to e type
1351 e113toe (&d, e) 128-bit long double precision to e type
1353 eabs (e) absolute value
1355 eadd (a, b, c) c = b + a
1357 ecmp (a, b) Returns 1 if a > b, 0 if a == b,
1358 -1 if a < b, -2 if either a or b is a NaN.
1359 ediv (a, b, c) c = b / a
1360 efloor (a, b) truncate to integer, toward -infinity
1361 efrexp (a, exp, s) extract exponent and significand
1362 eifrac (e, &l, frac) e to HOST_WIDE_INT and e type fraction
1363 euifrac (e, &l, frac) e to unsigned HOST_WIDE_INT and e type fraction
1364 einfin (e) set e to infinity, leaving its sign alone
1365 eldexp (a, n, b) multiply by 2**n
1367 emul (a, b, c) c = b * a
1370 eround (a, b) b = nearest integer value to a
1372 esub (a, b, c) c = b - a
1374 e24toasc (&f, str, n) single to ASCII string, n digits after decimal
1375 e53toasc (&d, str, n) double to ASCII string, n digits after decimal
1376 e64toasc (&d, str, n) 80-bit long double to ASCII string
1377 e113toasc (&d, str, n) 128-bit long double to ASCII string
1379 etoasc (e, str, n) e to ASCII string, n digits after decimal
1380 etoe24 (e, &f) convert e type to IEEE single precision
1381 etoe53 (e, &d) convert e type to IEEE double precision
1382 etoe64 (e, &d) convert e type to IEEE long double precision
1383 ltoe (&l, e) HOST_WIDE_INT to e type
1384 ultoe (&l, e) unsigned HOST_WIDE_INT to e type
1385 eisneg (e) 1 if sign bit of e != 0, else 0
1386 eisinf (e) 1 if e has maximum exponent (non-IEEE)
1387 or is infinite (IEEE)
1388 eisnan (e) 1 if e is a NaN
1391 Routines for internal format exploded e-type numbers
1393 eaddm (ai, bi) add significands, bi = bi + ai
1395 ecleazs (ei) set ei = 0 but leave its sign alone
1396 ecmpm (ai, bi) compare significands, return 1, 0, or -1
1397 edivm (ai, bi) divide significands, bi = bi / ai
1398 emdnorm (ai,l,s,exp) normalize and round off
1399 emovi (a, ai) convert external a to internal ai
1400 emovo (ai, a) convert internal ai to external a
1401 emovz (ai, bi) bi = ai, low guard word of bi = 0
1402 emulm (ai, bi) multiply significands, bi = bi * ai
1403 enormlz (ei) left-justify the significand
1404 eshdn1 (ai) shift significand and guards down 1 bit
1405 eshdn8 (ai) shift down 8 bits
1406 eshdn6 (ai) shift down 16 bits
1407 eshift (ai, n) shift ai n bits up (or down if n < 0)
1408 eshup1 (ai) shift significand and guards up 1 bit
1409 eshup8 (ai) shift up 8 bits
1410 eshup6 (ai) shift up 16 bits
1411 esubm (ai, bi) subtract significands, bi = bi - ai
1412 eiisinf (ai) 1 if infinite
1413 eiisnan (ai) 1 if a NaN
1414 eiisneg (ai) 1 if sign bit of ai != 0, else 0
1415 einan (ai) set ai = NaN
1417 eiinfin (ai) set ai = infinity
1420 The result is always normalized and rounded to NI-4 word precision
1421 after each arithmetic operation.
1423 Exception flags are NOT fully supported.
1425 Signaling NaN's are NOT supported; they are treated the same
1428 Define INFINITY for support of infinity; otherwise a
1429 saturation arithmetic is implemented.
1431 Define NANS for support of Not-a-Number items; otherwise the
1432 arithmetic will never produce a NaN output, and might be confused
1434 If NaN's are supported, the output of `ecmp (a,b)' is -2 if
1435 either a or b is a NaN. This means asking `if (ecmp (a,b) < 0)'
1436 may not be legitimate. Use `if (ecmp (a,b) == -1)' for `less than'
1439 Denormals are always supported here where appropriate (e.g., not
1440 for conversion to DEC numbers). */
1442 /* Definitions for error codes that are passed to the common error handling
1445 For Digital Equipment PDP-11 and VAX computers, certain
1446 IBM systems, and others that use numbers with a 56-bit
1447 significand, the symbol DEC should be defined. In this
1448 mode, most floating point constants are given as arrays
1449 of octal integers to eliminate decimal to binary conversion
1450 errors that might be introduced by the compiler.
1452 For computers, such as IBM PC, that follow the IEEE
1453 Standard for Binary Floating Point Arithmetic (ANSI/IEEE
1454 Std 754-1985), the symbol IEEE should be defined.
1455 These numbers have 53-bit significands. In this mode, constants
1456 are provided as arrays of hexadecimal 16 bit integers.
1457 The endian-ness of generated values is controlled by
1458 REAL_WORDS_BIG_ENDIAN.
1460 To accommodate other types of computer arithmetic, all
1461 constants are also provided in a normal decimal radix
1462 which one can hope are correctly converted to a suitable
1463 format by the available C language compiler. To invoke
1464 this mode, the symbol UNK is defined.
1466 An important difference among these modes is a predefined
1467 set of machine arithmetic constants for each. The numbers
1468 MACHEP (the machine roundoff error), MAXNUM (largest number
1469 represented), and several other parameters are preset by
1470 the configuration symbol. Check the file const.c to
1471 ensure that these values are correct for your computer.
1473 For ANSI C compatibility, define ANSIC equal to 1. Currently
1474 this affects only the atan2 function and others that use it. */
1476 /* Constant definitions for math error conditions. */
1478 #define DOMAIN 1 /* argument domain error */
1479 #define SING 2 /* argument singularity */
1480 #define OVERFLOW 3 /* overflow range error */
1481 #define UNDERFLOW 4 /* underflow range error */
1482 #define TLOSS 5 /* total loss of precision */
1483 #define PLOSS 6 /* partial loss of precision */
1484 #define INVALID 7 /* NaN-producing operation */
1486 /* e type constants used by high precision check routines */
1488 #if LONG_DOUBLE_TYPE_SIZE == 128
1490 unsigned EMUSHORT ezero[NE] =
1491 {0x0000, 0x0000, 0x0000, 0x0000,
1492 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,};
1493 extern unsigned EMUSHORT ezero[];
1496 unsigned EMUSHORT ehalf[NE] =
1497 {0x0000, 0x0000, 0x0000, 0x0000,
1498 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3ffe,};
1499 extern unsigned EMUSHORT ehalf[];
1502 unsigned EMUSHORT eone[NE] =
1503 {0x0000, 0x0000, 0x0000, 0x0000,
1504 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,};
1505 extern unsigned EMUSHORT eone[];
1508 unsigned EMUSHORT etwo[NE] =
1509 {0x0000, 0x0000, 0x0000, 0x0000,
1510 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000,};
1511 extern unsigned EMUSHORT etwo[];
1514 unsigned EMUSHORT e32[NE] =
1515 {0x0000, 0x0000, 0x0000, 0x0000,
1516 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4004,};
1517 extern unsigned EMUSHORT e32[];
1519 /* 6.93147180559945309417232121458176568075500134360255E-1 */
1520 unsigned EMUSHORT elog2[NE] =
1521 {0x40f3, 0xf6af, 0x03f2, 0xb398,
1522 0xc9e3, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
1523 extern unsigned EMUSHORT elog2[];
1525 /* 1.41421356237309504880168872420969807856967187537695E0 */
1526 unsigned EMUSHORT esqrt2[NE] =
1527 {0x1d6f, 0xbe9f, 0x754a, 0x89b3,
1528 0x597d, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
1529 extern unsigned EMUSHORT esqrt2[];
1531 /* 3.14159265358979323846264338327950288419716939937511E0 */
1532 unsigned EMUSHORT epi[NE] =
1533 {0x2902, 0x1cd1, 0x80dc, 0x628b,
1534 0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
1535 extern unsigned EMUSHORT epi[];
1538 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
1539 unsigned EMUSHORT ezero[NE] =
1540 {0, 0000000, 0000000, 0000000, 0000000, 0000000,};
1541 unsigned EMUSHORT ehalf[NE] =
1542 {0, 0000000, 0000000, 0000000, 0100000, 0x3ffe,};
1543 unsigned EMUSHORT eone[NE] =
1544 {0, 0000000, 0000000, 0000000, 0100000, 0x3fff,};
1545 unsigned EMUSHORT etwo[NE] =
1546 {0, 0000000, 0000000, 0000000, 0100000, 0040000,};
1547 unsigned EMUSHORT e32[NE] =
1548 {0, 0000000, 0000000, 0000000, 0100000, 0040004,};
1549 unsigned EMUSHORT elog2[NE] =
1550 {0xc9e4, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
1551 unsigned EMUSHORT esqrt2[NE] =
1552 {0x597e, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
1553 unsigned EMUSHORT epi[NE] =
1554 {0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
1557 /* Control register for rounding precision.
1558 This can be set to 113 (if NE=10), 80 (if NE=6), 64, 56, 53, or 24 bits. */
1563 /* Clear out entire e-type number X. */
1567 register unsigned EMUSHORT *x;
1571 for (i = 0; i < NE; i++)
1575 /* Move e-type number from A to B. */
1579 register unsigned EMUSHORT *a, *b;
1583 for (i = 0; i < NE; i++)
1589 /* Absolute value of e-type X. */
1593 unsigned EMUSHORT x[];
1595 /* sign is top bit of last word of external format */
1596 x[NE - 1] &= 0x7fff;
1600 /* Negate the e-type number X. */
1604 unsigned EMUSHORT x[];
1607 x[NE - 1] ^= 0x8000; /* Toggle the sign bit */
1610 /* Return 1 if sign bit of e-type number X is nonzero, else zero. */
1614 unsigned EMUSHORT x[];
1617 if (x[NE - 1] & 0x8000)
1623 /* Return 1 if e-type number X is infinity, else return zero. */
1627 unsigned EMUSHORT x[];
1634 if ((x[NE - 1] & 0x7fff) == 0x7fff)
1640 /* Check if e-type number is not a number. The bit pattern is one that we
1641 defined, so we know for sure how to detect it. */
1645 unsigned EMUSHORT x[];
1650 /* NaN has maximum exponent */
1651 if ((x[NE - 1] & 0x7fff) != 0x7fff)
1653 /* ... and non-zero significand field. */
1654 for (i = 0; i < NE - 1; i++)
1664 /* Fill e-type number X with infinity pattern (IEEE)
1665 or largest possible number (non-IEEE). */
1669 register unsigned EMUSHORT *x;
1674 for (i = 0; i < NE - 1; i++)
1678 for (i = 0; i < NE - 1; i++)
1706 /* Output an e-type NaN.
1707 This generates Intel's quiet NaN pattern for extended real.
1708 The exponent is 7fff, the leading mantissa word is c000. */
1712 register unsigned EMUSHORT *x;
1717 for (i = 0; i < NE - 2; i++)
1720 *x = (sign << 15) | 0x7fff;
1723 /* Move in an e-type number A, converting it to exploded e-type B. */
1727 unsigned EMUSHORT *a, *b;
1729 register unsigned EMUSHORT *p, *q;
1733 p = a + (NE - 1); /* point to last word of external number */
1734 /* get the sign bit */
1739 /* get the exponent */
1741 *q++ &= 0x7fff; /* delete the sign bit */
1743 if ((*(q - 1) & 0x7fff) == 0x7fff)
1749 for (i = 3; i < NI; i++)
1755 for (i = 2; i < NI; i++)
1761 /* clear high guard word */
1763 /* move in the significand */
1764 for (i = 0; i < NE - 1; i++)
1766 /* clear low guard word */
1770 /* Move out exploded e-type number A, converting it to e type B. */
1774 unsigned EMUSHORT *a, *b;
1776 register unsigned EMUSHORT *p, *q;
1777 unsigned EMUSHORT i;
1781 q = b + (NE - 1); /* point to output exponent */
1782 /* combine sign and exponent */
1785 *q-- = *p++ | 0x8000;
1789 if (*(p - 1) == 0x7fff)
1794 enan (b, eiisneg (a));
1802 /* skip over guard word */
1804 /* move the significand */
1805 for (j = 0; j < NE - 1; j++)
1809 /* Clear out exploded e-type number XI. */
1813 register unsigned EMUSHORT *xi;
1817 for (i = 0; i < NI; i++)
1821 /* Clear out exploded e-type XI, but don't touch the sign. */
1825 register unsigned EMUSHORT *xi;
1830 for (i = 0; i < NI - 1; i++)
1834 /* Move exploded e-type number from A to B. */
1838 register unsigned EMUSHORT *a, *b;
1842 for (i = 0; i < NI - 1; i++)
1844 /* clear low guard word */
1848 /* Generate exploded e-type NaN.
1849 The explicit pattern for this is maximum exponent and
1850 top two significant bits set. */
1854 unsigned EMUSHORT x[];
1862 /* Return nonzero if exploded e-type X is a NaN. */
1866 unsigned EMUSHORT x[];
1870 if ((x[E] & 0x7fff) == 0x7fff)
1872 for (i = M + 1; i < NI; i++)
1881 /* Return nonzero if sign of exploded e-type X is nonzero. */
1885 unsigned EMUSHORT x[];
1892 /* Fill exploded e-type X with infinity pattern.
1893 This has maximum exponent and significand all zeros. */
1897 unsigned EMUSHORT x[];
1905 /* Return nonzero if exploded e-type X is infinite. */
1909 unsigned EMUSHORT x[];
1916 if ((x[E] & 0x7fff) == 0x7fff)
1922 /* Compare significands of numbers in internal exploded e-type format.
1923 Guard words are included in the comparison.
1931 register unsigned EMUSHORT *a, *b;
1935 a += M; /* skip up to significand area */
1937 for (i = M; i < NI; i++)
1945 if (*(--a) > *(--b))
1951 /* Shift significand of exploded e-type X down by 1 bit. */
1955 register unsigned EMUSHORT *x;
1957 register unsigned EMUSHORT bits;
1960 x += M; /* point to significand area */
1963 for (i = M; i < NI; i++)
1975 /* Shift significand of exploded e-type X up by 1 bit. */
1979 register unsigned EMUSHORT *x;
1981 register unsigned EMUSHORT bits;
1987 for (i = M; i < NI; i++)
2000 /* Shift significand of exploded e-type X down by 8 bits. */
2004 register unsigned EMUSHORT *x;
2006 register unsigned EMUSHORT newbyt, oldbyt;
2011 for (i = M; i < NI; i++)
2021 /* Shift significand of exploded e-type X up by 8 bits. */
2025 register unsigned EMUSHORT *x;
2028 register unsigned EMUSHORT newbyt, oldbyt;
2033 for (i = M; i < NI; i++)
2043 /* Shift significand of exploded e-type X up by 16 bits. */
2047 register unsigned EMUSHORT *x;
2050 register unsigned EMUSHORT *p;
2055 for (i = M; i < NI - 1; i++)
2061 /* Shift significand of exploded e-type X down by 16 bits. */
2065 register unsigned EMUSHORT *x;
2068 register unsigned EMUSHORT *p;
2073 for (i = M; i < NI - 1; i++)
2079 /* Add significands of exploded e-type X and Y. X + Y replaces Y. */
2083 unsigned EMUSHORT *x, *y;
2085 register unsigned EMULONG a;
2092 for (i = M; i < NI; i++)
2094 a = (unsigned EMULONG) (*x) + (unsigned EMULONG) (*y) + carry;
2099 *y = (unsigned EMUSHORT) a;
2105 /* Subtract significands of exploded e-type X and Y. Y - X replaces Y. */
2109 unsigned EMUSHORT *x, *y;
2118 for (i = M; i < NI; i++)
2120 a = (unsigned EMULONG) (*y) - (unsigned EMULONG) (*x) - carry;
2125 *y = (unsigned EMUSHORT) a;
2132 static unsigned EMUSHORT equot[NI];
2136 /* Radix 2 shift-and-add versions of multiply and divide */
2139 /* Divide significands */
2143 unsigned EMUSHORT den[], num[];
2146 register unsigned EMUSHORT *p, *q;
2147 unsigned EMUSHORT j;
2153 for (i = M; i < NI; i++)
2158 /* Use faster compare and subtraction if denominator has only 15 bits of
2164 for (i = M + 3; i < NI; i++)
2169 if ((den[M + 1] & 1) != 0)
2177 for (i = 0; i < NBITS + 2; i++)
2195 /* The number of quotient bits to calculate is NBITS + 1 scaling guard
2196 bit + 1 roundoff bit. */
2201 for (i = 0; i < NBITS + 2; i++)
2203 if (ecmpm (den, num) <= 0)
2206 j = 1; /* quotient bit = 1 */
2220 /* test for nonzero remainder after roundoff bit */
2223 for (i = M; i < NI; i++)
2231 for (i = 0; i < NI; i++)
2237 /* Multiply significands */
2241 unsigned EMUSHORT a[], b[];
2243 unsigned EMUSHORT *p, *q;
2248 for (i = M; i < NI; i++)
2253 while (*p == 0) /* significand is not supposed to be zero */
2258 if ((*p & 0xff) == 0)
2266 for (i = 0; i < k; i++)
2270 /* remember if there were any nonzero bits shifted out */
2277 for (i = 0; i < NI; i++)
2280 /* return flag for lost nonzero bits */
2286 /* Radix 65536 versions of multiply and divide. */
2288 /* Multiply significand of e-type number B
2289 by 16-bit quantity A, return e-type result to C. */
2294 unsigned EMUSHORT b[], c[];
2296 register unsigned EMUSHORT *pp;
2297 register unsigned EMULONG carry;
2298 unsigned EMUSHORT *ps;
2299 unsigned EMUSHORT p[NI];
2300 unsigned EMULONG aa, m;
2309 for (i=M+1; i<NI; i++)
2319 m = (unsigned EMULONG) aa * *ps--;
2320 carry = (m & 0xffff) + *pp;
2321 *pp-- = (unsigned EMUSHORT)carry;
2322 carry = (carry >> 16) + (m >> 16) + *pp;
2323 *pp = (unsigned EMUSHORT)carry;
2324 *(pp-1) = carry >> 16;
2327 for (i=M; i<NI; i++)
2331 /* Divide significands of exploded e-types NUM / DEN. Neither the
2332 numerator NUM nor the denominator DEN is permitted to have its high guard
2337 unsigned EMUSHORT den[], num[];
2340 register unsigned EMUSHORT *p;
2341 unsigned EMULONG tnum;
2342 unsigned EMUSHORT j, tdenm, tquot;
2343 unsigned EMUSHORT tprod[NI+1];
2349 for (i=M; i<NI; i++)
2355 for (i=M; i<NI; i++)
2357 /* Find trial quotient digit (the radix is 65536). */
2358 tnum = (((unsigned EMULONG) num[M]) << 16) + num[M+1];
2360 /* Do not execute the divide instruction if it will overflow. */
2361 if ((tdenm * (unsigned long)0xffff) < tnum)
2364 tquot = tnum / tdenm;
2365 /* Multiply denominator by trial quotient digit. */
2366 m16m ((unsigned int)tquot, den, tprod);
2367 /* The quotient digit may have been overestimated. */
2368 if (ecmpm (tprod, num) > 0)
2372 if (ecmpm (tprod, num) > 0)
2382 /* test for nonzero remainder after roundoff bit */
2385 for (i=M; i<NI; i++)
2392 for (i=0; i<NI; i++)
2398 /* Multiply significands of exploded e-type A and B, result in B. */
2402 unsigned EMUSHORT a[], b[];
2404 unsigned EMUSHORT *p, *q;
2405 unsigned EMUSHORT pprod[NI];
2406 unsigned EMUSHORT j;
2411 for (i=M; i<NI; i++)
2417 for (i=M+1; i<NI; i++)
2425 m16m ((unsigned int) *p--, b, pprod);
2426 eaddm(pprod, equot);
2432 for (i=0; i<NI; i++)
2435 /* return flag for lost nonzero bits */
2441 /* Normalize and round off.
2443 The internal format number to be rounded is S.
2444 Input LOST is 0 if the value is exact. This is the so-called sticky bit.
2446 Input SUBFLG indicates whether the number was obtained
2447 by a subtraction operation. In that case if LOST is nonzero
2448 then the number is slightly smaller than indicated.
2450 Input EXP is the biased exponent, which may be negative.
2451 the exponent field of S is ignored but is replaced by
2452 EXP as adjusted by normalization and rounding.
2454 Input RCNTRL is the rounding control. If it is nonzero, the
2455 returned value will be rounded to RNDPRC bits.
2457 For future reference: In order for emdnorm to round off denormal
2458 significands at the right point, the input exponent must be
2459 adjusted to be the actual value it would have after conversion to
2460 the final floating point type. This adjustment has been
2461 implemented for all type conversions (etoe53, etc.) and decimal
2462 conversions, but not for the arithmetic functions (eadd, etc.).
2463 Data types having standard 15-bit exponents are not affected by
2464 this, but SFmode and DFmode are affected. For example, ediv with
2465 rndprc = 24 will not round correctly to 24-bit precision if the
2466 result is denormal. */
2468 static int rlast = -1;
2470 static unsigned EMUSHORT rmsk = 0;
2471 static unsigned EMUSHORT rmbit = 0;
2472 static unsigned EMUSHORT rebit = 0;
2474 static unsigned EMUSHORT rbit[NI];
2477 emdnorm (s, lost, subflg, exp, rcntrl)
2478 unsigned EMUSHORT s[];
2485 unsigned EMUSHORT r;
2490 /* a blank significand could mean either zero or infinity. */
2503 if ((j > NBITS) && (exp < 32767))
2511 if (exp > (EMULONG) (-NBITS - 1))
2524 /* Round off, unless told not to by rcntrl. */
2527 /* Set up rounding parameters if the control register changed. */
2528 if (rndprc != rlast)
2535 rw = NI - 1; /* low guard word */
2558 /* For DEC or IBM arithmetic */
2575 /* For C4x arithmetic */
2596 /* Shift down 1 temporarily if the data structure has an implied
2597 most significant bit and the number is denormal.
2598 Intel long double denormals also lose one bit of precision. */
2599 if ((exp <= 0) && (rndprc != NBITS)
2600 && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN)))
2602 lost |= s[NI - 1] & 1;
2605 /* Clear out all bits below the rounding bit,
2606 remembering in r if any were nonzero. */
2620 if ((r & rmbit) != 0)
2626 { /* round to even */
2627 if ((s[re] & rebit) == 0)
2640 /* Undo the temporary shift for denormal values. */
2641 if ((exp <= 0) && (rndprc != NBITS)
2642 && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN)))
2647 { /* overflow on roundoff */
2660 for (i = 2; i < NI - 1; i++)
2663 warning ("floating point overflow");
2667 for (i = M + 1; i < NI - 1; i++)
2670 if ((rndprc < 64) || (rndprc == 113))
2685 s[1] = (unsigned EMUSHORT) exp;
2688 /* Subtract. C = B - A, all e type numbers. */
2690 static int subflg = 0;
2694 unsigned EMUSHORT *a, *b, *c;
2708 /* Infinity minus infinity is a NaN.
2709 Test for subtracting infinities of the same sign. */
2710 if (eisinf (a) && eisinf (b)
2711 && ((eisneg (a) ^ eisneg (b)) == 0))
2713 mtherr ("esub", INVALID);
2722 /* Add. C = A + B, all e type. */
2726 unsigned EMUSHORT *a, *b, *c;
2730 /* NaN plus anything is a NaN. */
2741 /* Infinity minus infinity is a NaN.
2742 Test for adding infinities of opposite signs. */
2743 if (eisinf (a) && eisinf (b)
2744 && ((eisneg (a) ^ eisneg (b)) != 0))
2746 mtherr ("esub", INVALID);
2755 /* Arithmetic common to both addition and subtraction. */
2759 unsigned EMUSHORT *a, *b, *c;
2761 unsigned EMUSHORT ai[NI], bi[NI], ci[NI];
2763 EMULONG lt, lta, ltb;
2784 /* compare exponents */
2789 { /* put the larger number in bi */
2799 if (lt < (EMULONG) (-NBITS - 1))
2800 goto done; /* answer same as larger addend */
2802 lost = eshift (ai, k); /* shift the smaller number down */
2806 /* exponents were the same, so must compare significands */
2809 { /* the numbers are identical in magnitude */
2810 /* if different signs, result is zero */
2816 /* if same sign, result is double */
2817 /* double denormalized tiny number */
2818 if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0))
2823 /* add 1 to exponent unless both are zero! */
2824 for (j = 1; j < NI - 1; j++)
2840 bi[E] = (unsigned EMUSHORT) ltb;
2844 { /* put the larger number in bi */
2860 emdnorm (bi, lost, subflg, ltb, 64);
2866 /* Divide: C = B/A, all e type. */
2870 unsigned EMUSHORT *a, *b, *c;
2872 unsigned EMUSHORT ai[NI], bi[NI];
2874 EMULONG lt, lta, ltb;
2876 /* IEEE says if result is not a NaN, the sign is "-" if and only if
2877 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
2878 sign = eisneg(a) ^ eisneg(b);
2881 /* Return any NaN input. */
2892 /* Zero over zero, or infinity over infinity, is a NaN. */
2893 if (((ecmp (a, ezero) == 0) && (ecmp (b, ezero) == 0))
2894 || (eisinf (a) && eisinf (b)))
2896 mtherr ("ediv", INVALID);
2901 /* Infinity over anything else is infinity. */
2908 /* Anything else over infinity is zero. */
2920 { /* See if numerator is zero. */
2921 for (i = 1; i < NI - 1; i++)
2925 ltb -= enormlz (bi);
2935 { /* possible divide by zero */
2936 for (i = 1; i < NI - 1; i++)
2940 lta -= enormlz (ai);
2944 /* Divide by zero is not an invalid operation.
2945 It is a divide-by-zero operation! */
2947 mtherr ("ediv", SING);
2953 /* calculate exponent */
2954 lt = ltb - lta + EXONE;
2955 emdnorm (bi, i, 0, lt, 64);
2962 && (ecmp (c, ezero) != 0)
2965 *(c+(NE-1)) |= 0x8000;
2967 *(c+(NE-1)) &= ~0x8000;
2970 /* Multiply e-types A and B, return e-type product C. */
2974 unsigned EMUSHORT *a, *b, *c;
2976 unsigned EMUSHORT ai[NI], bi[NI];
2978 EMULONG lt, lta, ltb;
2980 /* IEEE says if result is not a NaN, the sign is "-" if and only if
2981 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
2982 sign = eisneg(a) ^ eisneg(b);
2985 /* NaN times anything is the same NaN. */
2996 /* Zero times infinity is a NaN. */
2997 if ((eisinf (a) && (ecmp (b, ezero) == 0))
2998 || (eisinf (b) && (ecmp (a, ezero) == 0)))
3000 mtherr ("emul", INVALID);
3005 /* Infinity times anything else is infinity. */
3007 if (eisinf (a) || eisinf (b))
3019 for (i = 1; i < NI - 1; i++)
3023 lta -= enormlz (ai);
3034 for (i = 1; i < NI - 1; i++)
3038 ltb -= enormlz (bi);
3047 /* Multiply significands */
3049 /* calculate exponent */
3050 lt = lta + ltb - (EXONE - 1);
3051 emdnorm (bi, j, 0, lt, 64);
3058 && (ecmp (c, ezero) != 0)
3061 *(c+(NE-1)) |= 0x8000;
3063 *(c+(NE-1)) &= ~0x8000;
3066 /* Convert double precision PE to e-type Y. */
3070 unsigned EMUSHORT *pe, *y;
3079 ibmtoe (pe, y, DFmode);
3084 c4xtoe (pe, y, HFmode);
3087 register unsigned EMUSHORT r;
3088 register unsigned EMUSHORT *e, *p;
3089 unsigned EMUSHORT yy[NI];
3093 denorm = 0; /* flag if denormalized number */
3095 if (! REAL_WORDS_BIG_ENDIAN)
3101 yy[M] = (r & 0x0f) | 0x10;
3102 r &= ~0x800f; /* strip sign and 4 significand bits */
3107 if (! REAL_WORDS_BIG_ENDIAN)
3109 if (((pe[3] & 0xf) != 0) || (pe[2] != 0)
3110 || (pe[1] != 0) || (pe[0] != 0))
3112 enan (y, yy[0] != 0);
3118 if (((pe[0] & 0xf) != 0) || (pe[1] != 0)
3119 || (pe[2] != 0) || (pe[3] != 0))
3121 enan (y, yy[0] != 0);
3132 #endif /* INFINITY */
3134 /* If zero exponent, then the significand is denormalized.
3135 So take back the understood high significand bit. */
3146 if (! REAL_WORDS_BIG_ENDIAN)
3163 /* If zero exponent, then normalize the significand. */
3164 if ((k = enormlz (yy)) > NBITS)
3167 yy[E] -= (unsigned EMUSHORT) (k - 1);
3170 #endif /* not C4X */
3171 #endif /* not IBM */
3172 #endif /* not DEC */
3175 /* Convert double extended precision float PE to e type Y. */
3179 unsigned EMUSHORT *pe, *y;
3181 unsigned EMUSHORT yy[NI];
3182 unsigned EMUSHORT *e, *p, *q;
3187 for (i = 0; i < NE - 5; i++)
3189 /* This precision is not ordinarily supported on DEC or IBM. */
3191 for (i = 0; i < 5; i++)
3195 p = &yy[0] + (NE - 1);
3198 for (i = 0; i < 5; i++)
3202 if (! REAL_WORDS_BIG_ENDIAN)
3204 for (i = 0; i < 5; i++)
3207 /* For denormal long double Intel format, shift significand up one
3208 -- but only if the top significand bit is zero. A top bit of 1
3209 is "pseudodenormal" when the exponent is zero. */
3210 if((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2] & 0x8000) == 0)
3212 unsigned EMUSHORT temp[NI];
3222 p = &yy[0] + (NE - 1);
3223 #ifdef ARM_EXTENDED_IEEE_FORMAT
3224 /* For ARMs, the exponent is in the lowest 15 bits of the word. */
3225 *p-- = (e[0] & 0x8000) | (e[1] & 0x7ffff);
3231 for (i = 0; i < 4; i++)
3236 /* Point to the exponent field and check max exponent cases. */
3238 if ((*p & 0x7fff) == 0x7fff)
3241 if (! REAL_WORDS_BIG_ENDIAN)
3243 for (i = 0; i < 4; i++)
3245 if ((i != 3 && pe[i] != 0)
3246 /* Anything but 0x8000 here, including 0, is a NaN. */
3247 || (i == 3 && pe[i] != 0x8000))
3249 enan (y, (*p & 0x8000) != 0);
3256 #ifdef ARM_EXTENDED_IEEE_FORMAT
3257 for (i = 2; i <= 5; i++)
3261 enan (y, (*p & 0x8000) != 0);
3266 /* In Motorola extended precision format, the most significant
3267 bit of an infinity mantissa could be either 1 or 0. It is
3268 the lower order bits that tell whether the value is a NaN. */
3269 if ((pe[2] & 0x7fff) != 0)
3272 for (i = 3; i <= 5; i++)
3277 enan (y, (*p & 0x8000) != 0);
3281 #endif /* not ARM */
3290 #endif /* INFINITY */
3293 for (i = 0; i < NE; i++)
3297 /* Convert 128-bit long double precision float PE to e type Y. */
3301 unsigned EMUSHORT *pe, *y;
3303 register unsigned EMUSHORT r;
3304 unsigned EMUSHORT *e, *p;
3305 unsigned EMUSHORT yy[NI];
3312 if (! REAL_WORDS_BIG_ENDIAN)
3324 if (! REAL_WORDS_BIG_ENDIAN)
3326 for (i = 0; i < 7; i++)
3330 enan (y, yy[0] != 0);
3337 for (i = 1; i < 8; i++)
3341 enan (y, yy[0] != 0);
3353 #endif /* INFINITY */
3357 if (! REAL_WORDS_BIG_ENDIAN)
3359 for (i = 0; i < 7; i++)
3365 for (i = 0; i < 7; i++)
3369 /* If denormal, remove the implied bit; else shift down 1. */
3382 /* Convert single precision float PE to e type Y. */
3386 unsigned EMUSHORT *pe, *y;
3390 ibmtoe (pe, y, SFmode);
3396 c4xtoe (pe, y, QFmode);
3400 register unsigned EMUSHORT r;
3401 register unsigned EMUSHORT *e, *p;
3402 unsigned EMUSHORT yy[NI];
3406 denorm = 0; /* flag if denormalized number */
3409 if (! REAL_WORDS_BIG_ENDIAN)
3419 yy[M] = (r & 0x7f) | 0200;
3420 r &= ~0x807f; /* strip sign and 7 significand bits */
3425 if (REAL_WORDS_BIG_ENDIAN)
3427 if (((pe[0] & 0x7f) != 0) || (pe[1] != 0))
3429 enan (y, yy[0] != 0);
3435 if (((pe[1] & 0x7f) != 0) || (pe[0] != 0))
3437 enan (y, yy[0] != 0);
3448 #endif /* INFINITY */
3450 /* If zero exponent, then the significand is denormalized.
3451 So take back the understood high significand bit. */
3464 if (! REAL_WORDS_BIG_ENDIAN)
3474 { /* if zero exponent, then normalize the significand */
3475 if ((k = enormlz (yy)) > NBITS)
3478 yy[E] -= (unsigned EMUSHORT) (k - 1);
3481 #endif /* not C4X */
3482 #endif /* not IBM */
3485 /* Convert e-type X to IEEE 128-bit long double format E. */
3489 unsigned EMUSHORT *x, *e;
3491 unsigned EMUSHORT xi[NI];
3498 make_nan (e, eisneg (x), TFmode);
3503 exp = (EMULONG) xi[E];
3508 /* round off to nearest or even */
3511 emdnorm (xi, 0, 0, exp, 64);
3517 /* Convert exploded e-type X, that has already been rounded to
3518 113-bit precision, to IEEE 128-bit long double format Y. */
3522 unsigned EMUSHORT *a, *b;
3524 register unsigned EMUSHORT *p, *q;
3525 unsigned EMUSHORT i;
3530 make_nan (b, eiisneg (a), TFmode);
3535 if (REAL_WORDS_BIG_ENDIAN)
3538 q = b + 7; /* point to output exponent */
3540 /* If not denormal, delete the implied bit. */
3545 /* combine sign and exponent */
3547 if (REAL_WORDS_BIG_ENDIAN)
3550 *q++ = *p++ | 0x8000;
3557 *q-- = *p++ | 0x8000;
3561 /* skip over guard word */
3563 /* move the significand */
3564 if (REAL_WORDS_BIG_ENDIAN)
3566 for (i = 0; i < 7; i++)
3571 for (i = 0; i < 7; i++)
3576 /* Convert e-type X to IEEE double extended format E. */
3580 unsigned EMUSHORT *x, *e;
3582 unsigned EMUSHORT xi[NI];
3589 make_nan (e, eisneg (x), XFmode);
3594 /* adjust exponent for offset */
3595 exp = (EMULONG) xi[E];
3600 /* round off to nearest or even */
3603 emdnorm (xi, 0, 0, exp, 64);
3609 /* Convert exploded e-type X, that has already been rounded to
3610 64-bit precision, to IEEE double extended format Y. */
3614 unsigned EMUSHORT *a, *b;
3616 register unsigned EMUSHORT *p, *q;
3617 unsigned EMUSHORT i;
3622 make_nan (b, eiisneg (a), XFmode);
3626 /* Shift denormal long double Intel format significand down one bit. */
3627 if ((a[E] == 0) && ! REAL_WORDS_BIG_ENDIAN)
3637 if (REAL_WORDS_BIG_ENDIAN)
3641 q = b + 4; /* point to output exponent */
3642 #if LONG_DOUBLE_TYPE_SIZE == 96
3643 /* Clear the last two bytes of 12-byte Intel format */
3649 /* combine sign and exponent */
3653 *q++ = *p++ | 0x8000;
3660 *q-- = *p++ | 0x8000;
3665 if (REAL_WORDS_BIG_ENDIAN)
3667 #ifdef ARM_EXTENDED_IEEE_FORMAT
3668 /* The exponent is in the lowest 15 bits of the first word. */
3669 *q++ = i ? 0x8000 : 0;
3673 *q++ = *p++ | 0x8000;
3682 *q-- = *p++ | 0x8000;
3687 /* skip over guard word */
3689 /* move the significand */
3691 for (i = 0; i < 4; i++)
3695 for (i = 0; i < 4; i++)
3699 if (REAL_WORDS_BIG_ENDIAN)
3701 for (i = 0; i < 4; i++)
3709 /* Intel long double infinity significand. */
3717 for (i = 0; i < 4; i++)
3723 /* e type to double precision. */
3726 /* Convert e-type X to DEC-format double E. */
3730 unsigned EMUSHORT *x, *e;
3732 etodec (x, e); /* see etodec.c */
3735 /* Convert exploded e-type X, that has already been rounded to
3736 56-bit double precision, to DEC double Y. */
3740 unsigned EMUSHORT *x, *y;
3747 /* Convert e-type X to IBM 370-format double E. */
3751 unsigned EMUSHORT *x, *e;
3753 etoibm (x, e, DFmode);
3756 /* Convert exploded e-type X, that has already been rounded to
3757 56-bit precision, to IBM 370 double Y. */
3761 unsigned EMUSHORT *x, *y;
3763 toibm (x, y, DFmode);
3766 #else /* it's neither DEC nor IBM */
3768 /* Convert e-type X to C4X-format long double E. */
3772 unsigned EMUSHORT *x, *e;
3774 etoc4x (x, e, HFmode);
3777 /* Convert exploded e-type X, that has already been rounded to
3778 56-bit precision, to IBM 370 double Y. */
3782 unsigned EMUSHORT *x, *y;
3784 toc4x (x, y, HFmode);
3787 #else /* it's neither DEC nor IBM nor C4X */
3789 /* Convert e-type X to IEEE double E. */
3793 unsigned EMUSHORT *x, *e;
3795 unsigned EMUSHORT xi[NI];
3802 make_nan (e, eisneg (x), DFmode);
3807 /* adjust exponent for offsets */
3808 exp = (EMULONG) xi[E] - (EXONE - 0x3ff);
3813 /* round off to nearest or even */
3816 emdnorm (xi, 0, 0, exp, 64);
3822 /* Convert exploded e-type X, that has already been rounded to
3823 53-bit precision, to IEEE double Y. */
3827 unsigned EMUSHORT *x, *y;
3829 unsigned EMUSHORT i;
3830 unsigned EMUSHORT *p;
3835 make_nan (y, eiisneg (x), DFmode);
3841 if (! REAL_WORDS_BIG_ENDIAN)
3844 *y = 0; /* output high order */
3846 *y = 0x8000; /* output sign bit */
3849 if (i >= (unsigned int) 2047)
3851 /* Saturate at largest number less than infinity. */
3854 if (! REAL_WORDS_BIG_ENDIAN)
3868 *y |= (unsigned EMUSHORT) 0x7fef;
3869 if (! REAL_WORDS_BIG_ENDIAN)
3894 i |= *p++ & (unsigned EMUSHORT) 0x0f; /* *p = xi[M] */
3895 *y |= (unsigned EMUSHORT) i; /* high order output already has sign bit set */
3896 if (! REAL_WORDS_BIG_ENDIAN)
3911 #endif /* not C4X */
3912 #endif /* not IBM */
3913 #endif /* not DEC */
3917 /* e type to single precision. */
3920 /* Convert e-type X to IBM 370 float E. */
3924 unsigned EMUSHORT *x, *e;
3926 etoibm (x, e, SFmode);
3929 /* Convert exploded e-type X, that has already been rounded to
3930 float precision, to IBM 370 float Y. */
3934 unsigned EMUSHORT *x, *y;
3936 toibm (x, y, SFmode);
3942 /* Convert e-type X to C4X float E. */
3946 unsigned EMUSHORT *x, *e;
3948 etoc4x (x, e, QFmode);
3951 /* Convert exploded e-type X, that has already been rounded to
3952 float precision, to IBM 370 float Y. */
3956 unsigned EMUSHORT *x, *y;
3958 toc4x (x, y, QFmode);
3963 /* Convert e-type X to IEEE float E. DEC float is the same as IEEE float. */
3967 unsigned EMUSHORT *x, *e;
3970 unsigned EMUSHORT xi[NI];
3976 make_nan (e, eisneg (x), SFmode);
3981 /* adjust exponent for offsets */
3982 exp = (EMULONG) xi[E] - (EXONE - 0177);
3987 /* round off to nearest or even */
3990 emdnorm (xi, 0, 0, exp, 64);
3996 /* Convert exploded e-type X, that has already been rounded to
3997 float precision, to IEEE float Y. */
4001 unsigned EMUSHORT *x, *y;
4003 unsigned EMUSHORT i;
4004 unsigned EMUSHORT *p;
4009 make_nan (y, eiisneg (x), SFmode);
4015 if (! REAL_WORDS_BIG_ENDIAN)
4021 *y = 0; /* output high order */
4023 *y = 0x8000; /* output sign bit */
4026 /* Handle overflow cases. */
4030 *y |= (unsigned EMUSHORT) 0x7f80;
4035 if (! REAL_WORDS_BIG_ENDIAN)
4043 #else /* no INFINITY */
4044 *y |= (unsigned EMUSHORT) 0x7f7f;
4049 if (! REAL_WORDS_BIG_ENDIAN)
4060 #endif /* no INFINITY */
4072 i |= *p++ & (unsigned EMUSHORT) 0x7f; /* *p = xi[M] */
4073 /* High order output already has sign bit set. */
4079 if (! REAL_WORDS_BIG_ENDIAN)
4088 #endif /* not C4X */
4089 #endif /* not IBM */
4091 /* Compare two e type numbers.
4095 -2 if either a or b is a NaN. */
4099 unsigned EMUSHORT *a, *b;
4101 unsigned EMUSHORT ai[NI], bi[NI];
4102 register unsigned EMUSHORT *p, *q;
4107 if (eisnan (a) || eisnan (b))
4116 { /* the signs are different */
4118 for (i = 1; i < NI - 1; i++)
4132 /* both are the same sign */
4147 return (0); /* equality */
4151 if (*(--p) > *(--q))
4152 return (msign); /* p is bigger */
4154 return (-msign); /* p is littler */
4158 /* Find e-type nearest integer to X, as floor (X + 0.5). */
4162 unsigned EMUSHORT *x, *y;
4169 /* Convert HOST_WIDE_INT LP to e type Y. */
4174 unsigned EMUSHORT *y;
4176 unsigned EMUSHORT yi[NI];
4177 unsigned HOST_WIDE_INT ll;
4183 /* make it positive */
4184 ll = (unsigned HOST_WIDE_INT) (-(*lp));
4185 yi[0] = 0xffff; /* put correct sign in the e type number */
4189 ll = (unsigned HOST_WIDE_INT) (*lp);
4191 /* move the long integer to yi significand area */
4192 #if HOST_BITS_PER_WIDE_INT == 64
4193 yi[M] = (unsigned EMUSHORT) (ll >> 48);
4194 yi[M + 1] = (unsigned EMUSHORT) (ll >> 32);
4195 yi[M + 2] = (unsigned EMUSHORT) (ll >> 16);
4196 yi[M + 3] = (unsigned EMUSHORT) ll;
4197 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
4199 yi[M] = (unsigned EMUSHORT) (ll >> 16);
4200 yi[M + 1] = (unsigned EMUSHORT) ll;
4201 yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
4204 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
4205 ecleaz (yi); /* it was zero */
4207 yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */
4208 emovo (yi, y); /* output the answer */
4211 /* Convert unsigned HOST_WIDE_INT LP to e type Y. */
4215 unsigned HOST_WIDE_INT *lp;
4216 unsigned EMUSHORT *y;
4218 unsigned EMUSHORT yi[NI];
4219 unsigned HOST_WIDE_INT ll;
4225 /* move the long integer to ayi significand area */
4226 #if HOST_BITS_PER_WIDE_INT == 64
4227 yi[M] = (unsigned EMUSHORT) (ll >> 48);
4228 yi[M + 1] = (unsigned EMUSHORT) (ll >> 32);
4229 yi[M + 2] = (unsigned EMUSHORT) (ll >> 16);
4230 yi[M + 3] = (unsigned EMUSHORT) ll;
4231 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
4233 yi[M] = (unsigned EMUSHORT) (ll >> 16);
4234 yi[M + 1] = (unsigned EMUSHORT) ll;
4235 yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
4238 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
4239 ecleaz (yi); /* it was zero */
4241 yi[E] -= (unsigned EMUSHORT) k; /* subtract shift count from exponent */
4242 emovo (yi, y); /* output the answer */
4246 /* Find signed HOST_WIDE_INT integer I and floating point fractional
4247 part FRAC of e-type (packed internal format) floating point input X.
4248 The integer output I has the sign of the input, except that
4249 positive overflow is permitted if FIXUNS_TRUNC_LIKE_FIX_TRUNC.
4250 The output e-type fraction FRAC is the positive fractional
4255 unsigned EMUSHORT *x;
4257 unsigned EMUSHORT *frac;
4259 unsigned EMUSHORT xi[NI];
4261 unsigned HOST_WIDE_INT ll;
4264 k = (int) xi[E] - (EXONE - 1);
4267 /* if exponent <= 0, integer = 0 and real output is fraction */
4272 if (k > (HOST_BITS_PER_WIDE_INT - 1))
4274 /* long integer overflow: output large integer
4275 and correct fraction */
4277 *i = ((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1);
4280 #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC
4281 /* In this case, let it overflow and convert as if unsigned. */
4282 euifrac (x, &ll, frac);
4283 *i = (HOST_WIDE_INT) ll;
4286 /* In other cases, return the largest positive integer. */
4287 *i = (((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1)) - 1;
4292 warning ("overflow on truncation to integer");
4296 /* Shift more than 16 bits: first shift up k-16 mod 16,
4297 then shift up by 16's. */
4298 j = k - ((k >> 4) << 4);
4305 ll = (ll << 16) | xi[M];
4307 while ((k -= 16) > 0);
4314 /* shift not more than 16 bits */
4316 *i = (HOST_WIDE_INT) xi[M] & 0xffff;
4323 if ((k = enormlz (xi)) > NBITS)
4326 xi[E] -= (unsigned EMUSHORT) k;
4332 /* Find unsigned HOST_WIDE_INT integer I and floating point fractional part
4333 FRAC of e-type X. A negative input yields integer output = 0 but
4334 correct fraction. */
4337 euifrac (x, i, frac)
4338 unsigned EMUSHORT *x;
4339 unsigned HOST_WIDE_INT *i;
4340 unsigned EMUSHORT *frac;
4342 unsigned HOST_WIDE_INT ll;
4343 unsigned EMUSHORT xi[NI];
4347 k = (int) xi[E] - (EXONE - 1);
4350 /* if exponent <= 0, integer = 0 and argument is fraction */
4355 if (k > HOST_BITS_PER_WIDE_INT)
4357 /* Long integer overflow: output large integer
4358 and correct fraction.
4359 Note, the BSD microvax compiler says that ~(0UL)
4360 is a syntax error. */
4364 warning ("overflow on truncation to unsigned integer");
4368 /* Shift more than 16 bits: first shift up k-16 mod 16,
4369 then shift up by 16's. */
4370 j = k - ((k >> 4) << 4);
4377 ll = (ll << 16) | xi[M];
4379 while ((k -= 16) > 0);
4384 /* shift not more than 16 bits */
4386 *i = (HOST_WIDE_INT) xi[M] & 0xffff;
4389 if (xi[0]) /* A negative value yields unsigned integer 0. */
4395 if ((k = enormlz (xi)) > NBITS)
4398 xi[E] -= (unsigned EMUSHORT) k;
4403 /* Shift the significand of exploded e-type X up or down by SC bits. */
4407 unsigned EMUSHORT *x;
4410 unsigned EMUSHORT lost;
4411 unsigned EMUSHORT *p;
4424 lost |= *p; /* remember lost bits */
4465 return ((int) lost);
4468 /* Shift normalize the significand area of exploded e-type X.
4469 Return the shift count (up = positive). */
4473 unsigned EMUSHORT x[];
4475 register unsigned EMUSHORT *p;
4484 return (0); /* already normalized */
4490 /* With guard word, there are NBITS+16 bits available.
4491 Return true if all are zero. */
4495 /* see if high byte is zero */
4496 while ((*p & 0xff00) == 0)
4501 /* now shift 1 bit at a time */
4502 while ((*p & 0x8000) == 0)
4508 mtherr ("enormlz", UNDERFLOW);
4514 /* Normalize by shifting down out of the high guard word
4515 of the significand */
4530 mtherr ("enormlz", OVERFLOW);
4537 /* Powers of ten used in decimal <-> binary conversions. */
4542 #if LONG_DOUBLE_TYPE_SIZE == 128
4543 static unsigned EMUSHORT etens[NTEN + 1][NE] =
4545 {0x6576, 0x4a92, 0x804a, 0x153f,
4546 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
4547 {0x6a32, 0xce52, 0x329a, 0x28ce,
4548 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
4549 {0x526c, 0x50ce, 0xf18b, 0x3d28,
4550 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
4551 {0x9c66, 0x58f8, 0xbc50, 0x5c54,
4552 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
4553 {0x851e, 0xeab7, 0x98fe, 0x901b,
4554 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
4555 {0x0235, 0x0137, 0x36b1, 0x336c,
4556 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
4557 {0x50f8, 0x25fb, 0xc76b, 0x6b71,
4558 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
4559 {0x0000, 0x0000, 0x0000, 0x0000,
4560 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
4561 {0x0000, 0x0000, 0x0000, 0x0000,
4562 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
4563 {0x0000, 0x0000, 0x0000, 0x0000,
4564 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
4565 {0x0000, 0x0000, 0x0000, 0x0000,
4566 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
4567 {0x0000, 0x0000, 0x0000, 0x0000,
4568 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
4569 {0x0000, 0x0000, 0x0000, 0x0000,
4570 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
4573 static unsigned EMUSHORT emtens[NTEN + 1][NE] =
4575 {0x2030, 0xcffc, 0xa1c3, 0x8123,
4576 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
4577 {0x8264, 0xd2cb, 0xf2ea, 0x12d4,
4578 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
4579 {0xf53f, 0xf698, 0x6bd3, 0x0158,
4580 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
4581 {0xe731, 0x04d4, 0xe3f2, 0xd332,
4582 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
4583 {0xa23e, 0x5308, 0xfefb, 0x1155,
4584 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
4585 {0xe26d, 0xdbde, 0xd05d, 0xb3f6,
4586 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
4587 {0x2a20, 0x6224, 0x47b3, 0x98d7,
4588 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
4589 {0x0b5b, 0x4af2, 0xa581, 0x18ed,
4590 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
4591 {0xbf71, 0xa9b3, 0x7989, 0xbe68,
4592 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
4593 {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b,
4594 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
4595 {0xc155, 0xa4a8, 0x404e, 0x6113,
4596 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
4597 {0xd70a, 0x70a3, 0x0a3d, 0xa3d7,
4598 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
4599 {0xcccd, 0xcccc, 0xcccc, 0xcccc,
4600 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
4603 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
4604 static unsigned EMUSHORT etens[NTEN + 1][NE] =
4606 {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
4607 {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
4608 {0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
4609 {0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
4610 {0xddbc, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
4611 {0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
4612 {0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
4613 {0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
4614 {0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
4615 {0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
4616 {0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
4617 {0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
4618 {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
4621 static unsigned EMUSHORT emtens[NTEN + 1][NE] =
4623 {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
4624 {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
4625 {0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
4626 {0x7133, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
4627 {0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
4628 {0xac7d, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
4629 {0x3f24, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
4630 {0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
4631 {0x4c2f, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
4632 {0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
4633 {0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
4634 {0x3d71, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
4635 {0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
4640 /* Convert float value X to ASCII string STRING with NDIG digits after
4641 the decimal point. */
4644 e24toasc (x, string, ndigs)
4645 unsigned EMUSHORT x[];
4649 unsigned EMUSHORT w[NI];
4652 etoasc (w, string, ndigs);
4655 /* Convert double value X to ASCII string STRING with NDIG digits after
4656 the decimal point. */
4659 e53toasc (x, string, ndigs)
4660 unsigned EMUSHORT x[];
4664 unsigned EMUSHORT w[NI];
4667 etoasc (w, string, ndigs);
4670 /* Convert double extended value X to ASCII string STRING with NDIG digits
4671 after the decimal point. */
4674 e64toasc (x, string, ndigs)
4675 unsigned EMUSHORT x[];
4679 unsigned EMUSHORT w[NI];
4682 etoasc (w, string, ndigs);
4685 /* Convert 128-bit long double value X to ASCII string STRING with NDIG digits
4686 after the decimal point. */
4689 e113toasc (x, string, ndigs)
4690 unsigned EMUSHORT x[];
4694 unsigned EMUSHORT w[NI];
4697 etoasc (w, string, ndigs);
4701 /* Convert e-type X to ASCII string STRING with NDIGS digits after
4702 the decimal point. */
4704 static char wstring[80]; /* working storage for ASCII output */
4707 etoasc (x, string, ndigs)
4708 unsigned EMUSHORT x[];
4713 unsigned EMUSHORT y[NI], t[NI], u[NI], w[NI];
4714 unsigned EMUSHORT *p, *r, *ten;
4715 unsigned EMUSHORT sign;
4716 int i, j, k, expon, rndsav;
4718 unsigned EMUSHORT m;
4729 sprintf (wstring, " NaN ");
4733 rndprc = NBITS; /* set to full precision */
4734 emov (x, y); /* retain external format */
4735 if (y[NE - 1] & 0x8000)
4738 y[NE - 1] &= 0x7fff;
4745 ten = &etens[NTEN][0];
4747 /* Test for zero exponent */
4750 for (k = 0; k < NE - 1; k++)
4753 goto tnzro; /* denormalized number */
4755 goto isone; /* valid all zeros */
4759 /* Test for infinity. */
4760 if (y[NE - 1] == 0x7fff)
4763 sprintf (wstring, " -Infinity ");
4765 sprintf (wstring, " Infinity ");
4769 /* Test for exponent nonzero but significand denormalized.
4770 * This is an error condition.
4772 if ((y[NE - 1] != 0) && ((y[NE - 2] & 0x8000) == 0))
4774 mtherr ("etoasc", DOMAIN);
4775 sprintf (wstring, "NaN");
4779 /* Compare to 1.0 */
4788 { /* Number is greater than 1 */
4789 /* Convert significand to an integer and strip trailing decimal zeros. */
4791 u[NE - 1] = EXONE + NBITS - 1;
4793 p = &etens[NTEN - 4][0];
4799 for (j = 0; j < NE - 1; j++)
4812 /* Rescale from integer significand */
4813 u[NE - 1] += y[NE - 1] - (unsigned int) (EXONE + NBITS - 1);
4815 /* Find power of 10 */
4819 /* An unordered compare result shouldn't happen here. */
4820 while (ecmp (ten, u) <= 0)
4822 if (ecmp (p, u) <= 0)
4835 { /* Number is less than 1.0 */
4836 /* Pad significand with trailing decimal zeros. */
4839 while ((y[NE - 2] & 0x8000) == 0)
4848 for (i = 0; i < NDEC + 1; i++)
4850 if ((w[NI - 1] & 0x7) != 0)
4852 /* multiply by 10 */
4865 if (eone[NE - 1] <= u[1])
4877 while (ecmp (eone, w) > 0)
4879 if (ecmp (p, w) >= 0)
4894 /* Find the first (leading) digit. */
4900 digit = equot[NI - 1];
4901 while ((digit == 0) && (ecmp (y, ezero) != 0))
4909 digit = equot[NI - 1];
4917 /* Examine number of digits requested by caller. */
4935 *s++ = (char)digit + '0';
4938 /* Generate digits after the decimal point. */
4939 for (k = 0; k <= ndigs; k++)
4941 /* multiply current number by 10, without normalizing */
4948 *s++ = (char) equot[NI - 1] + '0';
4950 digit = equot[NI - 1];
4953 /* round off the ASCII string */
4956 /* Test for critical rounding case in ASCII output. */
4960 if (ecmp (t, ezero) != 0)
4961 goto roun; /* round to nearest */
4963 if ((*(s - 1) & 1) == 0)
4964 goto doexp; /* round to even */
4967 /* Round up and propagate carry-outs */
4971 /* Carry out to most significant digit? */
4978 /* Most significant digit carries to 10? */
4986 /* Round up and carry out from less significant digits */
4998 sprintf (ss, "e+%d", expon);
5000 sprintf (ss, "e%d", expon);
5002 sprintf (ss, "e%d", expon);
5005 /* copy out the working string */
5008 while (*ss == ' ') /* strip possible leading space */
5010 while ((*s++ = *ss++) != '\0')
5015 /* Convert ASCII string to floating point.
5017 Numeric input is a free format decimal number of any length, with
5018 or without decimal point. Entering E after the number followed by an
5019 integer number causes the second number to be interpreted as a power of
5020 10 to be multiplied by the first number (i.e., "scientific" notation). */
5022 /* Convert ASCII string S to single precision float value Y. */
5027 unsigned EMUSHORT *y;
5033 /* Convert ASCII string S to double precision value Y. */
5038 unsigned EMUSHORT *y;
5040 #if defined(DEC) || defined(IBM)
5052 /* Convert ASCII string S to double extended value Y. */
5057 unsigned EMUSHORT *y;
5062 /* Convert ASCII string S to 128-bit long double Y. */
5067 unsigned EMUSHORT *y;
5069 asctoeg (s, y, 113);
5072 /* Convert ASCII string S to e type Y. */
5077 unsigned EMUSHORT *y;
5079 asctoeg (s, y, NBITS);
5082 /* Convert ASCII string SS to e type Y, with a specified rounding precision
5083 of OPREC bits. BASE is 16 for C9X hexadecimal floating constants. */
5086 asctoeg (ss, y, oprec)
5088 unsigned EMUSHORT *y;
5091 unsigned EMUSHORT yy[NI], xt[NI], tt[NI];
5092 int esign, decflg, sgnflg, nexp, exp, prec, lost;
5093 int k, trail, c, rndsav;
5095 unsigned EMUSHORT nsign, *p;
5096 char *sp, *s, *lstr;
5099 /* Copy the input string. */
5100 lstr = (char *) alloca (strlen (ss) + 1);
5103 while (*s == ' ') /* skip leading spaces */
5107 while ((*sp++ = *s++) != '\0')
5111 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
5118 rndprc = NBITS; /* Set to full precision */
5130 if (*s >= '0' && *s <= '9')
5136 if ((k >= 0) && (k < base))
5138 /* Ignore leading zeros */
5139 if ((prec == 0) && (decflg == 0) && (k == 0))
5141 /* Identify and strip trailing zeros after the decimal point. */
5142 if ((trail == 0) && (decflg != 0))
5145 while ((*sp >= '0' && *sp <= '9')
5146 || (base == 16 && ((*sp >= 'a' && *sp <= 'f')
5147 || (*sp >= 'A' && *sp <= 'F'))))
5149 /* Check for syntax error */
5151 if ((base != 10 || ((c != 'e') && (c != 'E')))
5152 && (base != 16 || ((c != 'p') && (c != 'P')))
5154 && (c != '\n') && (c != '\r') && (c != ' ')
5165 /* If enough digits were given to more than fill up the yy register,
5166 continuing until overflow into the high guard word yy[2]
5167 guarantees that there will be a roundoff bit at the top
5168 of the low guard word after normalization. */
5175 nexp += 4; /* count digits after decimal point */
5177 eshup1 (yy); /* multiply current number by 16 */
5185 nexp += 1; /* count digits after decimal point */
5187 eshup1 (yy); /* multiply current number by 10 */
5193 /* Insert the current digit. */
5195 xt[NI - 2] = (unsigned EMUSHORT) k;
5200 /* Mark any lost non-zero digit. */
5202 /* Count lost digits before the decimal point. */
5224 case '.': /* decimal point */
5254 mtherr ("asctoe", DOMAIN);
5263 /* Exponent interpretation */
5265 /* 0.0eXXX is zero, regardless of XXX. Check for the 0.0. */
5266 for (k = 0; k < NI; k++)
5277 /* check for + or - */
5285 while ((*s >= '0') && (*s <= '9'))
5294 if ((exp > MAXDECEXP) && (base == 10))
5298 yy[E] = 0x7fff; /* infinity */
5301 if ((exp < MINDECEXP) && (base == 10))
5311 /* Base 16 hexadecimal floating constant. */
5312 if ((k = enormlz (yy)) > NBITS)
5317 /* Adjust the exponent. NEXP is the number of hex digits,
5318 EXP is a power of 2. */
5319 lexp = (EXONE - 1 + NBITS) - k + yy[E] + exp - nexp;
5329 /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
5330 while ((nexp > 0) && (yy[2] == 0))
5342 if ((k = enormlz (yy)) > NBITS)
5347 lexp = (EXONE - 1 + NBITS) - k;
5348 emdnorm (yy, lost, 0, lexp, 64);
5351 /* Convert to external format:
5353 Multiply by 10**nexp. If precision is 64 bits,
5354 the maximum relative error incurred in forming 10**n
5355 for 0 <= n <= 324 is 8.2e-20, at 10**180.
5356 For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
5357 For 0 >= n >= -999, it is -1.55e-19 at 10**-435. */
5372 /* Punt. Can't handle this without 2 divides. */
5373 emovi (etens[0], tt);
5380 p = &etens[NTEN][0];
5390 while (exp <= MAXP);
5409 /* Round and convert directly to the destination type */
5411 lexp -= EXONE - 0x3ff;
5413 else if (oprec == 24 || oprec == 32)
5414 lexp -= (EXONE - 0x7f);
5417 else if (oprec == 24 || oprec == 56)
5418 lexp -= EXONE - (0x41 << 2);
5420 else if (oprec == 24)
5421 lexp -= EXONE - 0177;
5425 else if (oprec == 56)
5426 lexp -= EXONE - 0201;
5429 emdnorm (yy, lost, 0, lexp, 64);
5439 todec (yy, y); /* see etodec.c */
5444 toibm (yy, y, DFmode);
5449 toc4x (yy, y, HFmode);
5473 /* Return Y = largest integer not greater than X (truncated toward minus
5476 static unsigned EMUSHORT bmask[] =
5499 unsigned EMUSHORT x[], y[];
5501 register unsigned EMUSHORT *p;
5503 unsigned EMUSHORT f[NE];
5505 emov (x, f); /* leave in external format */
5506 expon = (int) f[NE - 1];
5507 e = (expon & 0x7fff) - (EXONE - 1);
5513 /* number of bits to clear out */
5525 /* clear the remaining bits */
5527 /* truncate negatives toward minus infinity */
5530 if ((unsigned EMUSHORT) expon & (unsigned EMUSHORT) 0x8000)
5532 for (i = 0; i < NE - 1; i++)
5545 /* Return S and EXP such that S * 2^EXP = X and .5 <= S < 1.
5546 For example, 1.1 = 0.55 * 2^1. */
5550 unsigned EMUSHORT x[];
5552 unsigned EMUSHORT s[];
5554 unsigned EMUSHORT xi[NI];
5558 /* Handle denormalized numbers properly using long integer exponent. */
5559 li = (EMULONG) ((EMUSHORT) xi[1]);
5567 *exp = (int) (li - 0x3ffe);
5571 /* Return e type Y = X * 2^PWR2. */
5575 unsigned EMUSHORT x[];
5577 unsigned EMUSHORT y[];
5579 unsigned EMUSHORT xi[NI];
5587 emdnorm (xi, i, i, li, 64);
5593 /* C = remainder after dividing B by A, all e type values.
5594 Least significant integer quotient bits left in EQUOT. */
5598 unsigned EMUSHORT a[], b[], c[];
5600 unsigned EMUSHORT den[NI], num[NI];
5604 || (ecmp (a, ezero) == 0)
5612 if (ecmp (a, ezero) == 0)
5614 mtherr ("eremain", SING);
5620 eiremain (den, num);
5621 /* Sign of remainder = sign of quotient */
5630 /* Return quotient of exploded e-types NUM / DEN in EQUOT,
5631 remainder in NUM. */
5635 unsigned EMUSHORT den[], num[];
5638 unsigned EMUSHORT j;
5641 ld -= enormlz (den);
5643 ln -= enormlz (num);
5647 if (ecmpm (den, num) <= 0)
5659 emdnorm (num, 0, 0, ln, 0);
5662 /* Report an error condition CODE encountered in function NAME.
5664 Mnemonic Value Significance
5666 DOMAIN 1 argument domain error
5667 SING 2 function singularity
5668 OVERFLOW 3 overflow range error
5669 UNDERFLOW 4 underflow range error
5670 TLOSS 5 total loss of precision
5671 PLOSS 6 partial loss of precision
5672 INVALID 7 NaN - producing operation
5673 EDOM 33 Unix domain error code
5674 ERANGE 34 Unix range error code
5676 The order of appearance of the following messages is bound to the
5677 error codes defined above. */
5687 /* The string passed by the calling program is supposed to be the
5688 name of the function in which the error occurred.
5689 The code argument selects which error message string will be printed. */
5691 if (strcmp (name, "esub") == 0)
5692 name = "subtraction";
5693 else if (strcmp (name, "ediv") == 0)
5695 else if (strcmp (name, "emul") == 0)
5696 name = "multiplication";
5697 else if (strcmp (name, "enormlz") == 0)
5698 name = "normalization";
5699 else if (strcmp (name, "etoasc") == 0)
5700 name = "conversion to text";
5701 else if (strcmp (name, "asctoe") == 0)
5703 else if (strcmp (name, "eremain") == 0)
5705 else if (strcmp (name, "esqrt") == 0)
5706 name = "square root";
5711 case DOMAIN: warning ("%s: argument domain error" , name); break;
5712 case SING: warning ("%s: function singularity" , name); break;
5713 case OVERFLOW: warning ("%s: overflow range error" , name); break;
5714 case UNDERFLOW: warning ("%s: underflow range error" , name); break;
5715 case TLOSS: warning ("%s: total loss of precision" , name); break;
5716 case PLOSS: warning ("%s: partial loss of precision", name); break;
5717 case INVALID: warning ("%s: NaN - producing operation", name); break;
5722 /* Set global error message word */
5727 /* Convert DEC double precision D to e type E. */
5731 unsigned EMUSHORT *d;
5732 unsigned EMUSHORT *e;
5734 unsigned EMUSHORT y[NI];
5735 register unsigned EMUSHORT r, *p;
5737 ecleaz (y); /* start with a zero */
5738 p = y; /* point to our number */
5739 r = *d; /* get DEC exponent word */
5740 if (*d & (unsigned int) 0x8000)
5741 *p = 0xffff; /* fill in our sign */
5742 ++p; /* bump pointer to our exponent word */
5743 r &= 0x7fff; /* strip the sign bit */
5744 if (r == 0) /* answer = 0 if high order DEC word = 0 */
5748 r >>= 7; /* shift exponent word down 7 bits */
5749 r += EXONE - 0201; /* subtract DEC exponent offset */
5750 /* add our e type exponent offset */
5751 *p++ = r; /* to form our exponent */
5753 r = *d++; /* now do the high order mantissa */
5754 r &= 0177; /* strip off the DEC exponent and sign bits */
5755 r |= 0200; /* the DEC understood high order mantissa bit */
5756 *p++ = r; /* put result in our high guard word */
5758 *p++ = *d++; /* fill in the rest of our mantissa */
5762 eshdn8 (y); /* shift our mantissa down 8 bits */
5767 /* Convert e type X to DEC double precision D. */
5771 unsigned EMUSHORT *x, *d;
5773 unsigned EMUSHORT xi[NI];
5778 /* Adjust exponent for offsets. */
5779 exp = (EMULONG) xi[E] - (EXONE - 0201);
5780 /* Round off to nearest or even. */
5783 emdnorm (xi, 0, 0, exp, 64);
5788 /* Convert exploded e-type X, that has already been rounded to
5789 56-bit precision, to DEC format double Y. */
5793 unsigned EMUSHORT *x, *y;
5795 unsigned EMUSHORT i;
5796 unsigned EMUSHORT *p;
5835 /* Convert IBM single/double precision to e type. */
5839 unsigned EMUSHORT *d;
5840 unsigned EMUSHORT *e;
5841 enum machine_mode mode;
5843 unsigned EMUSHORT y[NI];
5844 register unsigned EMUSHORT r, *p;
5847 ecleaz (y); /* start with a zero */
5848 p = y; /* point to our number */
5849 r = *d; /* get IBM exponent word */
5850 if (*d & (unsigned int) 0x8000)
5851 *p = 0xffff; /* fill in our sign */
5852 ++p; /* bump pointer to our exponent word */
5853 r &= 0x7f00; /* strip the sign bit */
5854 r >>= 6; /* shift exponent word down 6 bits */
5855 /* in fact shift by 8 right and 2 left */
5856 r += EXONE - (0x41 << 2); /* subtract IBM exponent offset */
5857 /* add our e type exponent offset */
5858 *p++ = r; /* to form our exponent */
5860 *p++ = *d++ & 0xff; /* now do the high order mantissa */
5861 /* strip off the IBM exponent and sign bits */
5862 if (mode != SFmode) /* there are only 2 words in SFmode */
5864 *p++ = *d++; /* fill in the rest of our mantissa */
5869 if (y[M] == 0 && y[M+1] == 0 && y[M+2] == 0 && y[M+3] == 0)
5872 y[E] -= 5 + enormlz (y); /* now normalise the mantissa */
5873 /* handle change in RADIX */
5879 /* Convert e type to IBM single/double precision. */
5883 unsigned EMUSHORT *x, *d;
5884 enum machine_mode mode;
5886 unsigned EMUSHORT xi[NI];
5891 exp = (EMULONG) xi[E] - (EXONE - (0x41 << 2)); /* adjust exponent for offsets */
5892 /* round off to nearest or even */
5895 emdnorm (xi, 0, 0, exp, 64);
5897 toibm (xi, d, mode);
5902 unsigned EMUSHORT *x, *y;
5903 enum machine_mode mode;
5905 unsigned EMUSHORT i;
5906 unsigned EMUSHORT *p;
5956 /* Convert C4X single/double precision to e type. */
5960 unsigned EMUSHORT *d;
5961 unsigned EMUSHORT *e;
5962 enum machine_mode mode;
5964 unsigned EMUSHORT y[NI];
5971 /* Short-circuit the zero case. */
5972 if ((d[0] == 0x8000)
5974 && ((mode == QFmode) || ((d[2] == 0x0000) && (d[3] == 0x0000))))
5985 ecleaz (y); /* start with a zero */
5986 r = d[0]; /* get sign/exponent part */
5987 if (r & (unsigned int) 0x0080)
5989 y[0] = 0xffff; /* fill in our sign */
5997 r >>= 8; /* Shift exponent word down 8 bits. */
5998 if (r & 0x80) /* Make the exponent negative if it is. */
6000 r = r | (~0 & ~0xff);
6005 /* Now do the high order mantissa. We don't "or" on the high bit
6006 because it is 2 (not 1) and is handled a little differently
6011 if (mode != QFmode) /* There are only 2 words in QFmode. */
6013 y[M+2] = d[2]; /* Fill in the rest of our mantissa. */
6023 /* Now do the two's complement on the data. */
6025 carry = 1; /* Initially add 1 for the two's complement. */
6026 for (i=size + M; i > M; i--)
6028 if (carry && (y[i] == 0x0000))
6030 /* We overflowed into the next word, carry is the same. */
6031 y[i] = carry ? 0x0000 : 0xffff;
6035 /* No overflow, just invert and add carry. */
6036 y[i] = ((~y[i]) + carry) & 0xffff;
6051 /* Add our e type exponent offset to form our exponent. */
6055 /* Now do the high order mantissa strip off the exponent and sign
6056 bits and add the high 1 bit. */
6057 y[M] = (d[0] & 0x7f) | 0x80;
6060 if (mode != QFmode) /* There are only 2 words in QFmode. */
6062 y[M+2] = d[2]; /* Fill in the rest of our mantissa. */
6072 /* Convert e type to C4X single/double precision. */
6076 unsigned EMUSHORT *x, *d;
6077 enum machine_mode mode;
6079 unsigned EMUSHORT xi[NI];
6085 /* Adjust exponent for offsets. */
6086 exp = (EMULONG) xi[E] - (EXONE - 0x7f);
6088 /* Round off to nearest or even. */
6090 rndprc = mode == QFmode ? 24 : 32;
6091 emdnorm (xi, 0, 0, exp, 64);
6093 toc4x (xi, d, mode);
6098 unsigned EMUSHORT *x, *y;
6099 enum machine_mode mode;
6105 /* Short-circuit the zero case */
6106 if ((x[0] == 0) /* Zero exponent and sign */
6108 && (x[M] == 0) /* The rest is for zero mantissa */
6110 /* Only check for double if necessary */
6111 && ((mode == QFmode) || ((x[M+2] == 0) && (x[M+3] == 0))))
6113 /* We have a zero. Put it into the output and return. */
6126 /* Negative number require a two's complement conversion of the
6132 i = ((int) x[1]) - 0x7f;
6134 /* Now add 1 to the inverted data to do the two's complement. */
6144 x[v] = carry ? 0x0000 : 0xffff;
6148 x[v] = ((~x[v]) + carry) & 0xffff;
6154 /* The following is a special case. The C4X negative float requires
6155 a zero in the high bit (because the format is (2 - x) x 2^m), so
6156 if a one is in that bit, we have to shift left one to get rid
6157 of it. This only occurs if the number is -1 x 2^m. */
6158 if (x[M+1] & 0x8000)
6160 /* This is the case of -1 x 2^m, we have to rid ourselves of the
6161 high sign bit and shift the exponent. */
6168 i = ((int) x[1]) - 0x7f;
6171 if ((i < -128) || (i > 127))
6186 y[0] |= ((i & 0xff) << 8);
6190 y[0] |= x[M] & 0x7f;
6200 /* Output a binary NaN bit pattern in the target machine's format. */
6202 /* If special NaN bit patterns are required, define them in tm.h
6203 as arrays of unsigned 16-bit shorts. Otherwise, use the default
6209 unsigned EMUSHORT TFbignan[8] =
6210 {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
6211 unsigned EMUSHORT TFlittlenan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
6219 unsigned EMUSHORT XFbignan[6] =
6220 {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
6221 unsigned EMUSHORT XFlittlenan[6] = {0, 0, 0, 0xc000, 0xffff, 0};
6229 unsigned EMUSHORT DFbignan[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
6230 unsigned EMUSHORT DFlittlenan[4] = {0, 0, 0, 0xfff8};
6238 unsigned EMUSHORT SFbignan[2] = {0x7fff, 0xffff};
6239 unsigned EMUSHORT SFlittlenan[2] = {0, 0xffc0};
6245 make_nan (nan, sign, mode)
6246 unsigned EMUSHORT *nan;
6248 enum machine_mode mode;
6251 unsigned EMUSHORT *p;
6255 /* Possibly the `reserved operand' patterns on a VAX can be
6256 used like NaN's, but probably not in the same way as IEEE. */
6257 #if !defined(DEC) && !defined(IBM) && !defined(C4X)
6260 if (REAL_WORDS_BIG_ENDIAN)
6268 if (REAL_WORDS_BIG_ENDIAN)
6276 if (REAL_WORDS_BIG_ENDIAN)
6285 if (REAL_WORDS_BIG_ENDIAN)
6295 if (REAL_WORDS_BIG_ENDIAN)
6296 *nan++ = (sign << 15) | (*p++ & 0x7fff);
6299 if (! REAL_WORDS_BIG_ENDIAN)
6300 *nan = (sign << 15) | (*p & 0x7fff);
6303 /* This is the inverse of the function `etarsingle' invoked by
6304 REAL_VALUE_TO_TARGET_SINGLE. */
6307 ereal_unto_float (f)
6311 unsigned EMUSHORT s[2];
6312 unsigned EMUSHORT e[NE];
6314 /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
6315 This is the inverse operation to what the function `endian' does. */
6316 if (REAL_WORDS_BIG_ENDIAN)
6318 s[0] = (unsigned EMUSHORT) (f >> 16);
6319 s[1] = (unsigned EMUSHORT) f;
6323 s[0] = (unsigned EMUSHORT) f;
6324 s[1] = (unsigned EMUSHORT) (f >> 16);
6326 /* Convert and promote the target float to E-type. */
6328 /* Output E-type to REAL_VALUE_TYPE. */
6334 /* This is the inverse of the function `etardouble' invoked by
6335 REAL_VALUE_TO_TARGET_DOUBLE. */
6338 ereal_unto_double (d)
6342 unsigned EMUSHORT s[4];
6343 unsigned EMUSHORT e[NE];
6345 /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
6346 if (REAL_WORDS_BIG_ENDIAN)
6348 s[0] = (unsigned EMUSHORT) (d[0] >> 16);
6349 s[1] = (unsigned EMUSHORT) d[0];
6350 s[2] = (unsigned EMUSHORT) (d[1] >> 16);
6351 s[3] = (unsigned EMUSHORT) d[1];
6355 /* Target float words are little-endian. */
6356 s[0] = (unsigned EMUSHORT) d[0];
6357 s[1] = (unsigned EMUSHORT) (d[0] >> 16);
6358 s[2] = (unsigned EMUSHORT) d[1];
6359 s[3] = (unsigned EMUSHORT) (d[1] >> 16);
6361 /* Convert target double to E-type. */
6363 /* Output E-type to REAL_VALUE_TYPE. */
6369 /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
6370 This is somewhat like ereal_unto_float, but the input types
6371 for these are different. */
6374 ereal_from_float (f)
6378 unsigned EMUSHORT s[2];
6379 unsigned EMUSHORT e[NE];
6381 /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
6382 This is the inverse operation to what the function `endian' does. */
6383 if (REAL_WORDS_BIG_ENDIAN)
6385 s[0] = (unsigned EMUSHORT) (f >> 16);
6386 s[1] = (unsigned EMUSHORT) f;
6390 s[0] = (unsigned EMUSHORT) f;
6391 s[1] = (unsigned EMUSHORT) (f >> 16);
6393 /* Convert and promote the target float to E-type. */
6395 /* Output E-type to REAL_VALUE_TYPE. */
6401 /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
6402 This is somewhat like ereal_unto_double, but the input types
6403 for these are different.
6405 The DFmode is stored as an array of HOST_WIDE_INT in the target's
6406 data format, with no holes in the bit packing. The first element
6407 of the input array holds the bits that would come first in the
6408 target computer's memory. */
6411 ereal_from_double (d)
6415 unsigned EMUSHORT s[4];
6416 unsigned EMUSHORT e[NE];
6418 /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
6419 if (REAL_WORDS_BIG_ENDIAN)
6421 s[0] = (unsigned EMUSHORT) (d[0] >> 16);
6422 s[1] = (unsigned EMUSHORT) d[0];
6423 #if HOST_BITS_PER_WIDE_INT == 32
6424 s[2] = (unsigned EMUSHORT) (d[1] >> 16);
6425 s[3] = (unsigned EMUSHORT) d[1];
6427 /* In this case the entire target double is contained in the
6428 first array element. The second element of the input is
6430 s[2] = (unsigned EMUSHORT) (d[0] >> 48);
6431 s[3] = (unsigned EMUSHORT) (d[0] >> 32);
6436 /* Target float words are little-endian. */
6437 s[0] = (unsigned EMUSHORT) d[0];
6438 s[1] = (unsigned EMUSHORT) (d[0] >> 16);
6439 #if HOST_BITS_PER_WIDE_INT == 32
6440 s[2] = (unsigned EMUSHORT) d[1];
6441 s[3] = (unsigned EMUSHORT) (d[1] >> 16);
6443 s[2] = (unsigned EMUSHORT) (d[0] >> 32);
6444 s[3] = (unsigned EMUSHORT) (d[0] >> 48);
6447 /* Convert target double to E-type. */
6449 /* Output E-type to REAL_VALUE_TYPE. */
6456 /* Convert target computer unsigned 64-bit integer to e-type.
6457 The endian-ness of DImode follows the convention for integers,
6458 so we use WORDS_BIG_ENDIAN here, not REAL_WORDS_BIG_ENDIAN. */
6462 unsigned EMUSHORT *di; /* Address of the 64-bit int. */
6463 unsigned EMUSHORT *e;
6465 unsigned EMUSHORT yi[NI];
6469 if (WORDS_BIG_ENDIAN)
6471 for (k = M; k < M + 4; k++)
6476 for (k = M + 3; k >= M; k--)
6479 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
6480 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
6481 ecleaz (yi); /* it was zero */
6483 yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */
6487 /* Convert target computer signed 64-bit integer to e-type. */
6491 unsigned EMUSHORT *di; /* Address of the 64-bit int. */
6492 unsigned EMUSHORT *e;
6494 unsigned EMULONG acc;
6495 unsigned EMUSHORT yi[NI];
6496 unsigned EMUSHORT carry;
6500 if (WORDS_BIG_ENDIAN)
6502 for (k = M; k < M + 4; k++)
6507 for (k = M + 3; k >= M; k--)
6510 /* Take absolute value */
6516 for (k = M + 3; k >= M; k--)
6518 acc = (unsigned EMULONG) (~yi[k] & 0xffff) + carry;
6525 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
6526 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
6527 ecleaz (yi); /* it was zero */
6529 yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */
6536 /* Convert e-type to unsigned 64-bit int. */
6540 unsigned EMUSHORT *x;
6541 unsigned EMUSHORT *i;
6543 unsigned EMUSHORT xi[NI];
6552 k = (int) xi[E] - (EXONE - 1);
6555 for (j = 0; j < 4; j++)
6561 for (j = 0; j < 4; j++)
6564 warning ("overflow on truncation to integer");
6569 /* Shift more than 16 bits: first shift up k-16 mod 16,
6570 then shift up by 16's. */
6571 j = k - ((k >> 4) << 4);
6575 if (WORDS_BIG_ENDIAN)
6586 if (WORDS_BIG_ENDIAN)
6591 while ((k -= 16) > 0);
6595 /* shift not more than 16 bits */
6600 if (WORDS_BIG_ENDIAN)
6619 /* Convert e-type to signed 64-bit int. */
6623 unsigned EMUSHORT *x;
6624 unsigned EMUSHORT *i;
6626 unsigned EMULONG acc;
6627 unsigned EMUSHORT xi[NI];
6628 unsigned EMUSHORT carry;
6629 unsigned EMUSHORT *isave;
6633 k = (int) xi[E] - (EXONE - 1);
6636 for (j = 0; j < 4; j++)
6642 for (j = 0; j < 4; j++)
6645 warning ("overflow on truncation to integer");
6651 /* Shift more than 16 bits: first shift up k-16 mod 16,
6652 then shift up by 16's. */
6653 j = k - ((k >> 4) << 4);
6657 if (WORDS_BIG_ENDIAN)
6668 if (WORDS_BIG_ENDIAN)
6673 while ((k -= 16) > 0);
6677 /* shift not more than 16 bits */
6680 if (WORDS_BIG_ENDIAN)
6696 /* Negate if negative */
6700 if (WORDS_BIG_ENDIAN)
6702 for (k = 0; k < 4; k++)
6704 acc = (unsigned EMULONG) (~(*isave) & 0xffff) + carry;
6705 if (WORDS_BIG_ENDIAN)
6717 /* Longhand square root routine. */
6720 static int esqinited = 0;
6721 static unsigned short sqrndbit[NI];
6725 unsigned EMUSHORT *x, *y;
6727 unsigned EMUSHORT temp[NI], num[NI], sq[NI], xx[NI];
6729 int i, j, k, n, nlups;
6734 sqrndbit[NI - 2] = 1;
6737 /* Check for arg <= 0 */
6738 i = ecmp (x, ezero);
6743 mtherr ("esqrt", DOMAIN);
6759 /* Bring in the arg and renormalize if it is denormal. */
6761 m = (EMULONG) xx[1]; /* local long word exponent */
6765 /* Divide exponent by 2 */
6767 exp = (unsigned short) ((m / 2) + 0x3ffe);
6769 /* Adjust if exponent odd */
6779 n = 8; /* get 8 bits of result per inner loop */
6785 /* bring in next word of arg */
6787 num[NI - 1] = xx[j + 3];
6788 /* Do additional bit on last outer loop, for roundoff. */
6791 for (i = 0; i < n; i++)
6793 /* Next 2 bits of arg */
6796 /* Shift up answer */
6798 /* Make trial divisor */
6799 for (k = 0; k < NI; k++)
6802 eaddm (sqrndbit, temp);
6803 /* Subtract and insert answer bit if it goes in */
6804 if (ecmpm (temp, num) <= 0)
6814 /* Adjust for extra, roundoff loop done. */
6815 exp += (NBITS - 1) - rndprc;
6817 /* Sticky bit = 1 if the remainder is nonzero. */
6819 for (i = 3; i < NI; i++)
6822 /* Renormalize and round off. */
6823 emdnorm (sq, k, 0, exp, 64);
6827 #endif /* EMU_NON_COMPILE not defined */
6829 /* Return the binary precision of the significand for a given
6830 floating point mode. The mode can hold an integer value
6831 that many bits wide, without losing any bits. */
6834 significand_size (mode)
6835 enum machine_mode mode;
6838 /* Don't test the modes, but their sizes, lest this
6839 code won't work for BITS_PER_UNIT != 8 . */
6841 switch (GET_MODE_BITSIZE (mode))
6845 #if TARGET_FLOAT_FORMAT == C4X_FLOAT_FORMAT
6852 #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
6855 #if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT
6858 #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT
6861 #if TARGET_FLOAT_FORMAT == C4X_FLOAT_FORMAT