* call.c: Fix comment formatting.
[official-gcc.git] / gcc / real.c
blobfdac05d54cf9b02684bfb3f4d4f9798fcd5c6cd5
1 /* real.c - implementation of REAL_ARITHMETIC, REAL_VALUE_ATOF,
2 and support for XFmode IEEE extended real floating point arithmetic.
3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000, 2002 Free Software Foundation, Inc.
5 Contributed by Stephen L. Moshier (moshier@world.std.com).
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA. */
24 #include "config.h"
25 #include "system.h"
26 #include "real.h"
27 #include "tree.h"
28 #include "toplev.h"
29 #include "tm_p.h"
31 /* To enable support of XFmode extended real floating point, define
32 LONG_DOUBLE_TYPE_SIZE 96 in the tm.h file (m68k.h or i386.h).
34 Machine files (tm.h etc) 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 first part of this file interfaces gcc to a floating point
41 arithmetic suite that was not written with gcc in mind. Avoid
42 changing the low-level arithmetic routines unless you have suitable
43 test programs available. A special version of the PARANOIA floating
44 point arithmetic tester, modified for this purpose, can be found on
45 usc.edu: /pub/C-numanal/ieeetest.zoo. Other tests, and libraries of
46 XFmode and TFmode transcendental functions, can be obtained by ftp from
47 netlib.att.com: netlib/cephes. */
49 /* Type of computer arithmetic.
50 Only one of DEC, IBM, IEEE, C4X, or UNK should get defined.
52 `IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically
53 to big-endian IEEE floating-point data structure. This definition
54 should work in SFmode `float' type and DFmode `double' type on
55 virtually all big-endian IEEE machines. If LONG_DOUBLE_TYPE_SIZE
56 has been defined to be 96, then IEEE also invokes the particular
57 XFmode (`long double' type) data structure used by the Motorola
58 680x0 series processors.
60 `IEEE', when REAL_WORDS_BIG_ENDIAN is zero, refers generally to
61 little-endian IEEE machines. In this case, if LONG_DOUBLE_TYPE_SIZE
62 has been defined to be 96, then IEEE also invokes the particular
63 XFmode `long double' data structure used by the Intel 80x86 series
64 processors.
66 `DEC' refers specifically to the Digital Equipment Corp PDP-11
67 and VAX floating point data structure. This model currently
68 supports no type wider than DFmode.
70 `IBM' refers specifically to the IBM System/370 and compatible
71 floating point data structure. This model currently supports
72 no type wider than DFmode. The IBM conversions were contributed by
73 frank@atom.ansto.gov.au (Frank Crawford).
75 `C4X' refers specifically to the floating point format used on
76 Texas Instruments TMS320C3x and TMS320C4x digital signal
77 processors. This supports QFmode (32-bit float, double) and HFmode
78 (40-bit long double) where BITS_PER_BYTE is 32. Unlike IEEE
79 floats, C4x floats are not rounded to be even. The C4x conversions
80 were contributed by m.hayes@elec.canterbury.ac.nz (Michael Hayes) and
81 Haj.Ten.Brugge@net.HCC.nl (Herman ten Brugge).
83 If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
84 then `long double' and `double' are both implemented, but they
85 both mean DFmode.
87 The case LONG_DOUBLE_TYPE_SIZE = 128 activates TFmode support
88 and may deactivate XFmode since `long double' is used to refer
89 to both modes. Defining INTEL_EXTENDED_IEEE_FORMAT to non-zero
90 at the same time enables 80387-style 80-bit floats in a 128-bit
91 padded image, as seen on IA-64.
93 The macros FLOAT_WORDS_BIG_ENDIAN, HOST_FLOAT_WORDS_BIG_ENDIAN,
94 contributed by Richard Earnshaw <Richard.Earnshaw@cl.cam.ac.uk>,
95 separate the floating point unit's endian-ness from that of
96 the integer addressing. This permits one to define a big-endian
97 FPU on a little-endian machine (e.g., ARM). An extension to
98 BYTES_BIG_ENDIAN may be required for some machines in the future.
99 These optional macros may be defined in tm.h. In real.h, they
100 default to WORDS_BIG_ENDIAN, etc., so there is no need to define
101 them for any normal host or target machine on which the floats
102 and the integers have the same endian-ness. */
105 /* The following converts gcc macros into the ones used by this file. */
107 #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT
108 /* PDP-11, Pro350, VAX: */
109 #define DEC 1
110 #else /* it's not VAX */
111 #if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT
112 /* IBM System/370 style */
113 #define IBM 1
114 #else /* it's also not an IBM */
115 #if TARGET_FLOAT_FORMAT == C4X_FLOAT_FORMAT
116 /* TMS320C3x/C4x style */
117 #define C4X 1
118 #else /* it's also not a C4X */
119 #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
120 #define IEEE
121 #else /* it's not IEEE either */
122 /* UNKnown arithmetic. We don't support this and can't go on. */
123 unknown arithmetic type
124 #define UNK 1
125 #endif /* not IEEE */
126 #endif /* not C4X */
127 #endif /* not IBM */
128 #endif /* not VAX */
130 #define REAL_WORDS_BIG_ENDIAN FLOAT_WORDS_BIG_ENDIAN
132 /* Make sure that the endianness is correct for IBM and DEC. */
133 #if defined(DEC)
134 #undef LARGEST_EXPONENT_IS_NORMAL
135 #define LARGEST_EXPONENT_IS_NORMAL(x) 1
136 #undef REAL_WORDS_BIG_ENDIAN
137 /* Strangely enough, DEC float most closely resembles big endian IEEE */
138 #define REAL_WORDS_BIG_ENDIAN 1
139 /* ... but the halfwords are reversed from IEEE big endian. */
140 #ifndef VAX_HALFWORD_ORDER
141 #define VAX_HALFWORD_ORDER 1
142 #endif
143 #else
144 #if defined(IBM)
145 #if !REAL_WORDS_BIG_ENDIAN
146 #error "Little-endian representations are not supported for IBM."
147 #endif
148 #endif
149 #endif
151 #if defined(DEC) && !defined (TARGET_G_FLOAT)
152 #define TARGET_G_FLOAT 0
153 #endif
155 #ifndef VAX_HALFWORD_ORDER
156 #define VAX_HALFWORD_ORDER 0
157 #endif
159 /* Define INFINITY for support of infinity.
160 Define NANS for support of Not-a-Number's (NaN's). */
161 #if !defined(DEC) && !defined(IBM) && !defined(C4X)
162 #define INFINITY
163 #define NANS
164 #endif
166 /* Support of NaNs requires support of infinity. */
167 #ifdef NANS
168 #ifndef INFINITY
169 #define INFINITY
170 #endif
171 #endif
173 /* Find a host integer type that is at least 16 bits wide,
174 and another type at least twice whatever that size is. */
176 #if HOST_BITS_PER_CHAR >= 16
177 #define EMUSHORT char
178 #define EMUSHORT_SIZE HOST_BITS_PER_CHAR
179 #define EMULONG_SIZE (2 * HOST_BITS_PER_CHAR)
180 #else
181 #if HOST_BITS_PER_SHORT >= 16
182 #define EMUSHORT short
183 #define EMUSHORT_SIZE HOST_BITS_PER_SHORT
184 #define EMULONG_SIZE (2 * HOST_BITS_PER_SHORT)
185 #else
186 #if HOST_BITS_PER_INT >= 16
187 #define EMUSHORT int
188 #define EMUSHORT_SIZE HOST_BITS_PER_INT
189 #define EMULONG_SIZE (2 * HOST_BITS_PER_INT)
190 #else
191 #if HOST_BITS_PER_LONG >= 16
192 #define EMUSHORT long
193 #define EMUSHORT_SIZE HOST_BITS_PER_LONG
194 #define EMULONG_SIZE (2 * HOST_BITS_PER_LONG)
195 #else
196 #error "You will have to modify this program to have a smaller unit size."
197 #endif
198 #endif
199 #endif
200 #endif
202 /* If no 16-bit type has been found and the compiler is GCC, try HImode. */
203 #if defined(__GNUC__) && EMUSHORT_SIZE != 16
204 typedef int HItype __attribute__ ((mode (HI)));
205 typedef unsigned int UHItype __attribute__ ((mode (HI)));
206 #undef EMUSHORT
207 #undef EMUSHORT_SIZE
208 #undef EMULONG_SIZE
209 #define EMUSHORT HItype
210 #define UEMUSHORT UHItype
211 #define EMUSHORT_SIZE 16
212 #define EMULONG_SIZE 32
213 #else
214 #define UEMUSHORT unsigned EMUSHORT
215 #endif
217 #if HOST_BITS_PER_SHORT >= EMULONG_SIZE
218 #define EMULONG short
219 #else
220 #if HOST_BITS_PER_INT >= EMULONG_SIZE
221 #define EMULONG int
222 #else
223 #if HOST_BITS_PER_LONG >= EMULONG_SIZE
224 #define EMULONG long
225 #else
226 #if HOST_BITS_PER_LONGLONG >= EMULONG_SIZE
227 #define EMULONG long long int
228 #else
229 #error "You will have to modify this program to have a smaller unit size."
230 #endif
231 #endif
232 #endif
233 #endif
235 #if EMUSHORT_SIZE != 16
236 #error "The host interface doesn't work if no 16-bit size exists."
237 #endif
239 /* Calculate the size of the generic "e" type. This always has
240 identical in-memory size to REAL_VALUE_TYPE. The sizes are supposed
241 to be the same as well, but when REAL_VALUE_TYPE_SIZE is not evenly
242 divisible by HOST_BITS_PER_WIDE_INT we have some padding in
243 REAL_VALUE_TYPE.
244 There are only two supported sizes: ten and six 16-bit words (160
245 or 96 bits). */
247 #if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && !INTEL_EXTENDED_IEEE_FORMAT
248 /* TFmode */
249 # define NE 10
250 # define MAXDECEXP 4932
251 # define MINDECEXP -4977
252 #else
253 # define NE 6
254 # define MAXDECEXP 4932
255 # define MINDECEXP -4956
256 #endif
258 /* Fail compilation if 2*NE is not the appropriate size.
259 If HOST_BITS_PER_WIDE_INT is 64, we're going to have padding
260 at the end of the array, because neither 96 nor 160 is
261 evenly divisible by 64. */
262 struct compile_test_dummy {
263 char twice_NE_must_equal_sizeof_REAL_VALUE_TYPE
264 [(sizeof (REAL_VALUE_TYPE) >= 2*NE) ? 1 : -1];
267 /* Construct macros to translate between REAL_VALUE_TYPE and e type.
268 In GET_REAL and PUT_REAL, r and e are pointers.
269 A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations
270 in memory, with no holes. */
271 #define GET_REAL(r, e) memcpy ((e), (r), 2*NE)
272 #define PUT_REAL(e, r) \
273 do { \
274 memcpy (r, e, 2*NE); \
275 if (2*NE < sizeof (*r)) \
276 memset ((char *) (r) + 2*NE, 0, sizeof (*r) - 2*NE); \
277 } while (0)
279 /* Number of 16 bit words in internal format */
280 #define NI (NE+3)
282 /* Array offset to exponent */
283 #define E 1
285 /* Array offset to high guard word */
286 #define M 2
288 /* Number of bits of precision */
289 #define NBITS ((NI-4)*16)
291 /* Maximum number of decimal digits in ASCII conversion
292 * = NBITS*log10(2)
294 #define NDEC (NBITS*8/27)
296 /* The exponent of 1.0 */
297 #define EXONE (0x3fff)
299 #if defined(HOST_EBCDIC)
300 /* bit 8 is significant in EBCDIC */
301 #define CHARMASK 0xff
302 #else
303 #define CHARMASK 0x7f
304 #endif
306 /* Information about the various IEEE precisions. At the moment, we only
307 support exponents of 15 bits or less. */
308 struct ieee_format
310 /* Precision. */
311 int precision;
313 /* Size of the exponent in bits. */
314 int expbits;
316 /* Overall size of the value in bits. */
317 int bits;
319 /* Mode used for representing the value. */
320 enum machine_mode mode;
322 /* Exponent adjustment for offsets. */
323 EMULONG adjustment;
326 #ifdef IEEE
327 /* IEEE float (24 bits). */
328 static const struct ieee_format ieee_24 =
333 SFmode,
334 EXONE - 0x7f
337 /* IEEE double (53 bits). */
338 static const struct ieee_format ieee_53 =
343 DFmode,
344 EXONE - 0x3ff
347 #endif /* IEEE */
349 /* IEEE extended double (64 bits). */
350 static const struct ieee_format ieee_64 =
355 XFmode,
359 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
360 /* IEEE long double (113 bits). */
361 static const struct ieee_format ieee_113 =
363 113,
365 128,
366 TFmode,
369 #endif /* INTEL_EXTENDED_IEEE_FORMAT == 0 */
371 #ifdef DEC
372 /* DEC F float (24 bits). */
373 static const struct ieee_format dec_f =
378 SFmode,
379 EXONE - 0201
382 /* DEC D float (56 bits). */
383 static const struct ieee_format dec_d =
388 DFmode,
389 EXONE - 0201
392 /* DEC G float (53 bits). */
393 static const struct ieee_format dec_g =
398 DFmode,
399 EXONE - 1025
402 #if 0
403 /* DEC H float (113 bits). (not yet used) */
404 static const struct ieee_format dec_h =
406 113,
408 128,
409 TFmode,
410 EXONE - 16385
412 #endif
413 #endif /* DEC */
415 extern int extra_warnings;
416 extern const UEMUSHORT ezero[NE], ehalf[NE], eone[NE], etwo[NE];
417 extern const UEMUSHORT elog2[NE], esqrt2[NE];
419 static void endian PARAMS ((const UEMUSHORT *, long *,
420 enum machine_mode));
421 static void eclear PARAMS ((UEMUSHORT *));
422 static void emov PARAMS ((const UEMUSHORT *, UEMUSHORT *));
423 #if 0
424 static void eabs PARAMS ((UEMUSHORT *));
425 #endif
426 static void eneg PARAMS ((UEMUSHORT *));
427 static int eisneg PARAMS ((const UEMUSHORT *));
428 static int eisinf PARAMS ((const UEMUSHORT *));
429 static int eisnan PARAMS ((const UEMUSHORT *));
430 static void einfin PARAMS ((UEMUSHORT *));
431 #ifdef NANS
432 static void enan PARAMS ((UEMUSHORT *, int));
433 static void einan PARAMS ((UEMUSHORT *));
434 static int eiisnan PARAMS ((const UEMUSHORT *));
435 static void make_nan PARAMS ((UEMUSHORT *, int, enum machine_mode));
436 #endif
437 static int eiisneg PARAMS ((const UEMUSHORT *));
438 static void saturate PARAMS ((UEMUSHORT *, int, int, int));
439 static void emovi PARAMS ((const UEMUSHORT *, UEMUSHORT *));
440 static void emovo PARAMS ((const UEMUSHORT *, UEMUSHORT *));
441 static void ecleaz PARAMS ((UEMUSHORT *));
442 static void ecleazs PARAMS ((UEMUSHORT *));
443 static void emovz PARAMS ((const UEMUSHORT *, UEMUSHORT *));
444 #if 0
445 static void eiinfin PARAMS ((UEMUSHORT *));
446 #endif
447 #ifdef INFINITY
448 static int eiisinf PARAMS ((const UEMUSHORT *));
449 #endif
450 static int ecmpm PARAMS ((const UEMUSHORT *, const UEMUSHORT *));
451 static void eshdn1 PARAMS ((UEMUSHORT *));
452 static void eshup1 PARAMS ((UEMUSHORT *));
453 static void eshdn8 PARAMS ((UEMUSHORT *));
454 static void eshup8 PARAMS ((UEMUSHORT *));
455 static void eshup6 PARAMS ((UEMUSHORT *));
456 static void eshdn6 PARAMS ((UEMUSHORT *));
457 static void eaddm PARAMS ((const UEMUSHORT *, UEMUSHORT *));\f
458 static void esubm PARAMS ((const UEMUSHORT *, UEMUSHORT *));
459 static void m16m PARAMS ((unsigned int, const UEMUSHORT *, UEMUSHORT *));
460 static int edivm PARAMS ((const UEMUSHORT *, UEMUSHORT *));
461 static int emulm PARAMS ((const UEMUSHORT *, UEMUSHORT *));
462 static void emdnorm PARAMS ((UEMUSHORT *, int, int, EMULONG, int));
463 static void esub PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
464 UEMUSHORT *));
465 static void eadd PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
466 UEMUSHORT *));
467 static void eadd1 PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
468 UEMUSHORT *));
469 static void ediv PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
470 UEMUSHORT *));
471 static void emul PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
472 UEMUSHORT *));
473 static void e53toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
474 static void e64toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
475 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
476 static void e113toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
477 #endif
478 static void e24toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
479 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
480 static void etoe113 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
481 static void toe113 PARAMS ((UEMUSHORT *, UEMUSHORT *));
482 #endif
483 static void etoe64 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
484 static void toe64 PARAMS ((UEMUSHORT *, UEMUSHORT *));
485 static void etoe53 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
486 static void toe53 PARAMS ((UEMUSHORT *, UEMUSHORT *));
487 static void etoe24 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
488 static void toe24 PARAMS ((UEMUSHORT *, UEMUSHORT *));
489 static void ieeetoe PARAMS ((const UEMUSHORT *, UEMUSHORT *,
490 const struct ieee_format *));
491 static void etoieee PARAMS ((const UEMUSHORT *, UEMUSHORT *,
492 const struct ieee_format *));
493 static void toieee PARAMS ((UEMUSHORT *, UEMUSHORT *,
494 const struct ieee_format *));
495 static int ecmp PARAMS ((const UEMUSHORT *, const UEMUSHORT *));
496 #if 0
497 static void eround PARAMS ((const UEMUSHORT *, UEMUSHORT *));
498 #endif
499 static void ltoe PARAMS ((const HOST_WIDE_INT *, UEMUSHORT *));
500 static void ultoe PARAMS ((const unsigned HOST_WIDE_INT *, UEMUSHORT *));
501 static void eifrac PARAMS ((const UEMUSHORT *, HOST_WIDE_INT *,
502 UEMUSHORT *));
503 static void euifrac PARAMS ((const UEMUSHORT *, unsigned HOST_WIDE_INT *,
504 UEMUSHORT *));
505 static int eshift PARAMS ((UEMUSHORT *, int));
506 static int enormlz PARAMS ((UEMUSHORT *));
507 #if 0
508 static void e24toasc PARAMS ((const UEMUSHORT *, char *, int));
509 static void e53toasc PARAMS ((const UEMUSHORT *, char *, int));
510 static void e64toasc PARAMS ((const UEMUSHORT *, char *, int));
511 static void e113toasc PARAMS ((const UEMUSHORT *, char *, int));
512 #endif /* 0 */
513 static void etoasc PARAMS ((const UEMUSHORT *, char *, int));
514 static void asctoe24 PARAMS ((const char *, UEMUSHORT *));
515 static void asctoe53 PARAMS ((const char *, UEMUSHORT *));
516 static void asctoe64 PARAMS ((const char *, UEMUSHORT *));
517 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
518 static void asctoe113 PARAMS ((const char *, UEMUSHORT *));
519 #endif
520 static void asctoe PARAMS ((const char *, UEMUSHORT *));
521 static void asctoeg PARAMS ((const char *, UEMUSHORT *, int));
522 static void efloor PARAMS ((const UEMUSHORT *, UEMUSHORT *));
523 #if 0
524 static void efrexp PARAMS ((const UEMUSHORT *, int *,
525 UEMUSHORT *));
526 #endif
527 static void eldexp PARAMS ((const UEMUSHORT *, int, UEMUSHORT *));
528 #if 0
529 static void eremain PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
530 UEMUSHORT *));
531 #endif
532 static void eiremain PARAMS ((UEMUSHORT *, UEMUSHORT *));
533 static void mtherr PARAMS ((const char *, int));
534 #ifdef DEC
535 static void dectoe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
536 static void etodec PARAMS ((const UEMUSHORT *, UEMUSHORT *));
537 static void todec PARAMS ((UEMUSHORT *, UEMUSHORT *));
538 #endif
539 #ifdef IBM
540 static void ibmtoe PARAMS ((const UEMUSHORT *, UEMUSHORT *,
541 enum machine_mode));
542 static void etoibm PARAMS ((const UEMUSHORT *, UEMUSHORT *,
543 enum machine_mode));
544 static void toibm PARAMS ((UEMUSHORT *, UEMUSHORT *,
545 enum machine_mode));
546 #endif
547 #ifdef C4X
548 static void c4xtoe PARAMS ((const UEMUSHORT *, UEMUSHORT *,
549 enum machine_mode));
550 static void etoc4x PARAMS ((const UEMUSHORT *, UEMUSHORT *,
551 enum machine_mode));
552 static void toc4x PARAMS ((UEMUSHORT *, UEMUSHORT *,
553 enum machine_mode));
554 #endif
555 #if 0
556 static void uditoe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
557 static void ditoe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
558 static void etoudi PARAMS ((const UEMUSHORT *, UEMUSHORT *));
559 static void etodi PARAMS ((const UEMUSHORT *, UEMUSHORT *));
560 static void esqrt PARAMS ((const UEMUSHORT *, UEMUSHORT *));
561 #endif
563 /* Copy 32-bit numbers obtained from array containing 16-bit numbers,
564 swapping ends if required, into output array of longs. The
565 result is normally passed to fprintf by the ASM_OUTPUT_ macros. */
567 static void
568 endian (e, x, mode)
569 const UEMUSHORT e[];
570 long x[];
571 enum machine_mode mode;
573 unsigned long th, t;
575 if (REAL_WORDS_BIG_ENDIAN && !VAX_HALFWORD_ORDER)
577 switch (mode)
579 case TFmode:
580 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
581 /* Swap halfwords in the fourth long. */
582 th = (unsigned long) e[6] & 0xffff;
583 t = (unsigned long) e[7] & 0xffff;
584 t |= th << 16;
585 x[3] = (long) t;
586 #else
587 x[3] = 0;
588 #endif
589 /* FALLTHRU */
591 case XFmode:
592 /* Swap halfwords in the third long. */
593 th = (unsigned long) e[4] & 0xffff;
594 t = (unsigned long) e[5] & 0xffff;
595 t |= th << 16;
596 x[2] = (long) t;
597 /* FALLTHRU */
599 case DFmode:
600 /* Swap halfwords in the second word. */
601 th = (unsigned long) e[2] & 0xffff;
602 t = (unsigned long) e[3] & 0xffff;
603 t |= th << 16;
604 x[1] = (long) t;
605 /* FALLTHRU */
607 case SFmode:
608 case HFmode:
609 /* Swap halfwords in the first word. */
610 th = (unsigned long) e[0] & 0xffff;
611 t = (unsigned long) e[1] & 0xffff;
612 t |= th << 16;
613 x[0] = (long) t;
614 break;
616 default:
617 abort ();
620 else
622 /* Pack the output array without swapping. */
624 switch (mode)
626 case TFmode:
627 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
628 /* Pack the fourth long. */
629 th = (unsigned long) e[7] & 0xffff;
630 t = (unsigned long) e[6] & 0xffff;
631 t |= th << 16;
632 x[3] = (long) t;
633 #else
634 x[3] = 0;
635 #endif
636 /* FALLTHRU */
638 case XFmode:
639 /* Pack the third long.
640 Each element of the input REAL_VALUE_TYPE array has 16 useful bits
641 in it. */
642 th = (unsigned long) e[5] & 0xffff;
643 t = (unsigned long) e[4] & 0xffff;
644 t |= th << 16;
645 x[2] = (long) t;
646 /* FALLTHRU */
648 case DFmode:
649 /* Pack the second long */
650 th = (unsigned long) e[3] & 0xffff;
651 t = (unsigned long) e[2] & 0xffff;
652 t |= th << 16;
653 x[1] = (long) t;
654 /* FALLTHRU */
656 case SFmode:
657 case HFmode:
658 /* Pack the first long */
659 th = (unsigned long) e[1] & 0xffff;
660 t = (unsigned long) e[0] & 0xffff;
661 t |= th << 16;
662 x[0] = (long) t;
663 break;
665 default:
666 abort ();
672 /* This is the implementation of the REAL_ARITHMETIC macro. */
674 void
675 earith (value, icode, r1, r2)
676 REAL_VALUE_TYPE *value;
677 int icode;
678 REAL_VALUE_TYPE *r1;
679 REAL_VALUE_TYPE *r2;
681 UEMUSHORT d1[NE], d2[NE], v[NE];
682 enum tree_code code;
684 GET_REAL (r1, d1);
685 GET_REAL (r2, d2);
686 #ifdef NANS
687 /* Return NaN input back to the caller. */
688 if (eisnan (d1))
690 PUT_REAL (d1, value);
691 return;
693 if (eisnan (d2))
695 PUT_REAL (d2, value);
696 return;
698 #endif
699 code = (enum tree_code) icode;
700 switch (code)
702 case PLUS_EXPR:
703 eadd (d2, d1, v);
704 break;
706 case MINUS_EXPR:
707 esub (d2, d1, v); /* d1 - d2 */
708 break;
710 case MULT_EXPR:
711 emul (d2, d1, v);
712 break;
714 case RDIV_EXPR:
715 #ifndef INFINITY
716 if (ecmp (d2, ezero) == 0)
717 abort ();
718 #endif
719 ediv (d2, d1, v); /* d1/d2 */
720 break;
722 case MIN_EXPR: /* min (d1,d2) */
723 if (ecmp (d1, d2) < 0)
724 emov (d1, v);
725 else
726 emov (d2, v);
727 break;
729 case MAX_EXPR: /* max (d1,d2) */
730 if (ecmp (d1, d2) > 0)
731 emov (d1, v);
732 else
733 emov (d2, v);
734 break;
735 default:
736 emov (ezero, v);
737 break;
739 PUT_REAL (v, value);
743 /* Truncate REAL_VALUE_TYPE toward zero to signed HOST_WIDE_INT.
744 implements REAL_VALUE_RNDZINT (x) (etrunci (x)). */
746 REAL_VALUE_TYPE
747 etrunci (x)
748 REAL_VALUE_TYPE x;
750 UEMUSHORT f[NE], g[NE];
751 REAL_VALUE_TYPE r;
752 HOST_WIDE_INT l;
754 GET_REAL (&x, g);
755 #ifdef NANS
756 if (eisnan (g))
757 return (x);
758 #endif
759 eifrac (g, &l, f);
760 ltoe (&l, g);
761 PUT_REAL (g, &r);
762 return (r);
766 /* Truncate REAL_VALUE_TYPE toward zero to unsigned HOST_WIDE_INT;
767 implements REAL_VALUE_UNSIGNED_RNDZINT (x) (etruncui (x)). */
769 REAL_VALUE_TYPE
770 etruncui (x)
771 REAL_VALUE_TYPE x;
773 UEMUSHORT f[NE], g[NE];
774 REAL_VALUE_TYPE r;
775 unsigned HOST_WIDE_INT l;
777 GET_REAL (&x, g);
778 #ifdef NANS
779 if (eisnan (g))
780 return (x);
781 #endif
782 euifrac (g, &l, f);
783 ultoe (&l, g);
784 PUT_REAL (g, &r);
785 return (r);
789 /* This is the REAL_VALUE_ATOF function. It converts a decimal or hexadecimal
790 string to binary, rounding off as indicated by the machine_mode argument.
791 Then it promotes the rounded value to REAL_VALUE_TYPE. */
793 REAL_VALUE_TYPE
794 ereal_atof (s, t)
795 const char *s;
796 enum machine_mode t;
798 UEMUSHORT tem[NE], e[NE];
799 REAL_VALUE_TYPE r;
801 switch (t)
803 #ifdef C4X
804 case QFmode:
805 case HFmode:
806 asctoe53 (s, tem);
807 e53toe (tem, e);
808 break;
809 #else
810 case HFmode:
811 #endif
813 case SFmode:
814 asctoe24 (s, tem);
815 e24toe (tem, e);
816 break;
818 case DFmode:
819 asctoe53 (s, tem);
820 e53toe (tem, e);
821 break;
823 case TFmode:
824 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
825 asctoe113 (s, tem);
826 e113toe (tem, e);
827 break;
828 #endif
829 /* FALLTHRU */
831 case XFmode:
832 asctoe64 (s, tem);
833 e64toe (tem, e);
834 break;
836 default:
837 asctoe (s, e);
839 PUT_REAL (e, &r);
840 return (r);
844 /* Expansion of REAL_NEGATE. */
846 REAL_VALUE_TYPE
847 ereal_negate (x)
848 REAL_VALUE_TYPE x;
850 UEMUSHORT e[NE];
851 REAL_VALUE_TYPE r;
853 GET_REAL (&x, e);
854 eneg (e);
855 PUT_REAL (e, &r);
856 return (r);
860 /* Round real toward zero to HOST_WIDE_INT;
861 implements REAL_VALUE_FIX (x). */
863 HOST_WIDE_INT
864 efixi (x)
865 REAL_VALUE_TYPE x;
867 UEMUSHORT f[NE], g[NE];
868 HOST_WIDE_INT l;
870 GET_REAL (&x, f);
871 #ifdef NANS
872 if (eisnan (f))
874 warning ("conversion from NaN to int");
875 return (-1);
877 #endif
878 eifrac (f, &l, g);
879 return l;
882 /* Round real toward zero to unsigned HOST_WIDE_INT
883 implements REAL_VALUE_UNSIGNED_FIX (x).
884 Negative input returns zero. */
886 unsigned HOST_WIDE_INT
887 efixui (x)
888 REAL_VALUE_TYPE x;
890 UEMUSHORT f[NE], g[NE];
891 unsigned HOST_WIDE_INT l;
893 GET_REAL (&x, f);
894 #ifdef NANS
895 if (eisnan (f))
897 warning ("conversion from NaN to unsigned int");
898 return (-1);
900 #endif
901 euifrac (f, &l, g);
902 return l;
906 /* REAL_VALUE_FROM_INT macro. */
908 void
909 ereal_from_int (d, i, j, mode)
910 REAL_VALUE_TYPE *d;
911 HOST_WIDE_INT i, j;
912 enum machine_mode mode;
914 UEMUSHORT df[NE], dg[NE];
915 HOST_WIDE_INT low, high;
916 int sign;
918 if (GET_MODE_CLASS (mode) != MODE_FLOAT)
919 abort ();
920 sign = 0;
921 low = i;
922 if ((high = j) < 0)
924 sign = 1;
925 /* complement and add 1 */
926 high = ~high;
927 if (low)
928 low = -low;
929 else
930 high += 1;
932 eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
933 ultoe ((unsigned HOST_WIDE_INT *) &high, dg);
934 emul (dg, df, dg);
935 ultoe ((unsigned HOST_WIDE_INT *) &low, df);
936 eadd (df, dg, dg);
937 if (sign)
938 eneg (dg);
940 /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
941 Avoid double-rounding errors later by rounding off now from the
942 extra-wide internal format to the requested precision. */
943 switch (GET_MODE_BITSIZE (mode))
945 case 32:
946 etoe24 (dg, df);
947 e24toe (df, dg);
948 break;
950 case 64:
951 etoe53 (dg, df);
952 e53toe (df, dg);
953 break;
955 case 96:
956 etoe64 (dg, df);
957 e64toe (df, dg);
958 break;
960 case 128:
961 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
962 etoe113 (dg, df);
963 e113toe (df, dg);
964 #else
965 etoe64 (dg, df);
966 e64toe (df, dg);
967 #endif
968 break;
970 default:
971 abort ();
974 PUT_REAL (dg, d);
978 /* REAL_VALUE_FROM_UNSIGNED_INT macro. */
980 void
981 ereal_from_uint (d, i, j, mode)
982 REAL_VALUE_TYPE *d;
983 unsigned HOST_WIDE_INT i, j;
984 enum machine_mode mode;
986 UEMUSHORT df[NE], dg[NE];
987 unsigned HOST_WIDE_INT low, high;
989 if (GET_MODE_CLASS (mode) != MODE_FLOAT)
990 abort ();
991 low = i;
992 high = j;
993 eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
994 ultoe (&high, dg);
995 emul (dg, df, dg);
996 ultoe (&low, df);
997 eadd (df, dg, dg);
999 /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
1000 Avoid double-rounding errors later by rounding off now from the
1001 extra-wide internal format to the requested precision. */
1002 switch (GET_MODE_BITSIZE (mode))
1004 case 32:
1005 etoe24 (dg, df);
1006 e24toe (df, dg);
1007 break;
1009 case 64:
1010 etoe53 (dg, df);
1011 e53toe (df, dg);
1012 break;
1014 case 96:
1015 etoe64 (dg, df);
1016 e64toe (df, dg);
1017 break;
1019 case 128:
1020 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
1021 etoe113 (dg, df);
1022 e113toe (df, dg);
1023 #else
1024 etoe64 (dg, df);
1025 e64toe (df, dg);
1026 #endif
1027 break;
1029 default:
1030 abort ();
1033 PUT_REAL (dg, d);
1037 /* REAL_VALUE_TO_INT macro. */
1039 void
1040 ereal_to_int (low, high, rr)
1041 HOST_WIDE_INT *low, *high;
1042 REAL_VALUE_TYPE rr;
1044 UEMUSHORT d[NE], df[NE], dg[NE], dh[NE];
1045 int s;
1047 GET_REAL (&rr, d);
1048 #ifdef NANS
1049 if (eisnan (d))
1051 warning ("conversion from NaN to int");
1052 *low = -1;
1053 *high = -1;
1054 return;
1056 #endif
1057 /* convert positive value */
1058 s = 0;
1059 if (eisneg (d))
1061 eneg (d);
1062 s = 1;
1064 eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
1065 ediv (df, d, dg); /* dg = d / 2^32 is the high word */
1066 euifrac (dg, (unsigned HOST_WIDE_INT *) high, dh);
1067 emul (df, dh, dg); /* fractional part is the low word */
1068 euifrac (dg, (unsigned HOST_WIDE_INT *) low, dh);
1069 if (s)
1071 /* complement and add 1 */
1072 *high = ~(*high);
1073 if (*low)
1074 *low = -(*low);
1075 else
1076 *high += 1;
1081 /* REAL_VALUE_LDEXP macro. */
1083 REAL_VALUE_TYPE
1084 ereal_ldexp (x, n)
1085 REAL_VALUE_TYPE x;
1086 int n;
1088 UEMUSHORT e[NE], y[NE];
1089 REAL_VALUE_TYPE r;
1091 GET_REAL (&x, e);
1092 #ifdef NANS
1093 if (eisnan (e))
1094 return (x);
1095 #endif
1096 eldexp (e, n, y);
1097 PUT_REAL (y, &r);
1098 return (r);
1101 /* Check for infinity in a REAL_VALUE_TYPE. */
1104 target_isinf (x)
1105 REAL_VALUE_TYPE x ATTRIBUTE_UNUSED;
1107 #ifdef INFINITY
1108 UEMUSHORT e[NE];
1110 GET_REAL (&x, e);
1111 return (eisinf (e));
1112 #else
1113 return 0;
1114 #endif
1117 /* Check whether a REAL_VALUE_TYPE item is a NaN. */
1120 target_isnan (x)
1121 REAL_VALUE_TYPE x ATTRIBUTE_UNUSED;
1123 #ifdef NANS
1124 UEMUSHORT e[NE];
1126 GET_REAL (&x, e);
1127 return (eisnan (e));
1128 #else
1129 return (0);
1130 #endif
1134 /* Check for a negative REAL_VALUE_TYPE number.
1135 This just checks the sign bit, so that -0 counts as negative. */
1138 target_negative (x)
1139 REAL_VALUE_TYPE x;
1141 return ereal_isneg (x);
1144 /* Expansion of REAL_VALUE_TRUNCATE.
1145 The result is in floating point, rounded to nearest or even. */
1147 REAL_VALUE_TYPE
1148 real_value_truncate (mode, arg)
1149 enum machine_mode mode;
1150 REAL_VALUE_TYPE arg;
1152 UEMUSHORT e[NE], t[NE];
1153 REAL_VALUE_TYPE r;
1155 GET_REAL (&arg, e);
1156 #ifdef NANS
1157 if (eisnan (e))
1158 return (arg);
1159 #endif
1160 eclear (t);
1161 switch (mode)
1163 case TFmode:
1164 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
1165 etoe113 (e, t);
1166 e113toe (t, t);
1167 break;
1168 #endif
1169 /* FALLTHRU */
1171 case XFmode:
1172 etoe64 (e, t);
1173 e64toe (t, t);
1174 break;
1176 case DFmode:
1177 etoe53 (e, t);
1178 e53toe (t, t);
1179 break;
1181 case SFmode:
1182 #ifndef C4X
1183 case HFmode:
1184 #endif
1185 etoe24 (e, t);
1186 e24toe (t, t);
1187 break;
1189 #ifdef C4X
1190 case HFmode:
1191 case QFmode:
1192 etoe53 (e, t);
1193 e53toe (t, t);
1194 break;
1195 #endif
1197 case SImode:
1198 r = etrunci (arg);
1199 return (r);
1201 /* If an unsupported type was requested, presume that
1202 the machine files know something useful to do with
1203 the unmodified value. */
1205 default:
1206 return (arg);
1208 PUT_REAL (t, &r);
1209 return (r);
1212 /* Return true if ARG can be represented exactly in MODE. */
1214 bool
1215 exact_real_truncate (mode, arg)
1216 enum machine_mode mode;
1217 REAL_VALUE_TYPE *arg;
1219 REAL_VALUE_TYPE trunc;
1221 if (target_isnan (*arg))
1222 return false;
1224 trunc = real_value_truncate (mode, *arg);
1225 return ereal_cmp (*arg, trunc) == 0;
1228 /* Try to change R into its exact multiplicative inverse in machine mode
1229 MODE. Return nonzero function value if successful. */
1232 exact_real_inverse (mode, r)
1233 enum machine_mode mode;
1234 REAL_VALUE_TYPE *r;
1236 UEMUSHORT e[NE], einv[NE];
1237 REAL_VALUE_TYPE rinv;
1238 int i;
1240 GET_REAL (r, e);
1242 /* Test for input in range. Don't transform IEEE special values. */
1243 if (eisinf (e) || eisnan (e) || (ecmp (e, ezero) == 0))
1244 return 0;
1246 /* Test for a power of 2: all significand bits zero except the MSB.
1247 We are assuming the target has binary (or hex) arithmetic. */
1248 if (e[NE - 2] != 0x8000)
1249 return 0;
1251 for (i = 0; i < NE - 2; i++)
1253 if (e[i] != 0)
1254 return 0;
1257 /* Compute the inverse and truncate it to the required mode. */
1258 ediv (e, eone, einv);
1259 PUT_REAL (einv, &rinv);
1260 rinv = real_value_truncate (mode, rinv);
1262 #ifdef CHECK_FLOAT_VALUE
1263 /* This check is not redundant. It may, for example, flush
1264 a supposedly IEEE denormal value to zero. */
1265 i = 0;
1266 if (CHECK_FLOAT_VALUE (mode, rinv, i))
1267 return 0;
1268 #endif
1269 GET_REAL (&rinv, einv);
1271 /* Check the bits again, because the truncation might have
1272 generated an arbitrary saturation value on overflow. */
1273 if (einv[NE - 2] != 0x8000)
1274 return 0;
1276 for (i = 0; i < NE - 2; i++)
1278 if (einv[i] != 0)
1279 return 0;
1282 /* Fail if the computed inverse is out of range. */
1283 if (eisinf (einv) || eisnan (einv) || (ecmp (einv, ezero) == 0))
1284 return 0;
1286 /* Output the reciprocal and return success flag. */
1287 PUT_REAL (einv, r);
1288 return 1;
1291 /* Used for debugging--print the value of R in human-readable format
1292 on stderr. */
1294 void
1295 debug_real (r)
1296 REAL_VALUE_TYPE r;
1298 char dstr[30];
1300 REAL_VALUE_TO_DECIMAL (r, dstr, -1);
1301 fprintf (stderr, "%s", dstr);
1305 /* The following routines convert REAL_VALUE_TYPE to the various floating
1306 point formats that are meaningful to supported computers.
1308 The results are returned in 32-bit pieces, each piece stored in a `long'.
1309 This is so they can be printed by statements like
1311 fprintf (file, "%lx, %lx", L[0], L[1]);
1313 that will work on both narrow- and wide-word host computers. */
1315 /* Convert R to a 128-bit long double precision value. The output array L
1316 contains four 32-bit pieces of the result, in the order they would appear
1317 in memory. */
1319 void
1320 etartdouble (r, l)
1321 REAL_VALUE_TYPE r;
1322 long l[];
1324 UEMUSHORT e[NE];
1326 GET_REAL (&r, e);
1327 #if INTEL_EXTENDED_IEEE_FORMAT == 0
1328 etoe113 (e, e);
1329 #else
1330 etoe64 (e, e);
1331 #endif
1332 endian (e, l, TFmode);
1335 /* Convert R to a double extended precision value. The output array L
1336 contains three 32-bit pieces of the result, in the order they would
1337 appear in memory. */
1339 void
1340 etarldouble (r, l)
1341 REAL_VALUE_TYPE r;
1342 long l[];
1344 UEMUSHORT e[NE];
1346 GET_REAL (&r, e);
1347 etoe64 (e, e);
1348 endian (e, l, XFmode);
1351 /* Convert R to a double precision value. The output array L contains two
1352 32-bit pieces of the result, in the order they would appear in memory. */
1354 void
1355 etardouble (r, l)
1356 REAL_VALUE_TYPE r;
1357 long l[];
1359 UEMUSHORT e[NE];
1361 GET_REAL (&r, e);
1362 etoe53 (e, e);
1363 endian (e, l, DFmode);
1366 /* Convert R to a single precision float value stored in the least-significant
1367 bits of a `long'. */
1369 long
1370 etarsingle (r)
1371 REAL_VALUE_TYPE r;
1373 UEMUSHORT e[NE];
1374 long l;
1376 GET_REAL (&r, e);
1377 etoe24 (e, e);
1378 endian (e, &l, SFmode);
1379 return ((long) l);
1382 /* Convert X to a decimal ASCII string S for output to an assembly
1383 language file. Note, there is no standard way to spell infinity or
1384 a NaN, so these values may require special treatment in the tm.h
1385 macros.
1387 The argument DIGITS is the number of decimal digits to print,
1388 or -1 to indicate "enough", i.e. DECIMAL_DIG for for the target. */
1390 void
1391 ereal_to_decimal (x, s, digits)
1392 REAL_VALUE_TYPE x;
1393 char *s;
1394 int digits;
1396 UEMUSHORT e[NE];
1397 GET_REAL (&x, e);
1399 /* Find DECIMAL_DIG for the target. */
1400 if (digits < 0)
1401 switch (TARGET_FLOAT_FORMAT)
1403 case IEEE_FLOAT_FORMAT:
1404 switch (LONG_DOUBLE_TYPE_SIZE)
1406 case 32:
1407 digits = 9;
1408 break;
1409 case 64:
1410 digits = 17;
1411 break;
1412 case 128:
1413 if (!INTEL_EXTENDED_IEEE_FORMAT)
1415 digits = 36;
1416 break;
1418 /* FALLTHRU */
1419 case 96:
1420 digits = 21;
1421 break;
1423 default:
1424 abort ();
1426 break;
1428 case VAX_FLOAT_FORMAT:
1429 digits = 18; /* D_FLOAT */
1430 break;
1432 case IBM_FLOAT_FORMAT:
1433 digits = 18;
1434 break;
1436 case C4X_FLOAT_FORMAT:
1437 digits = 11;
1438 break;
1440 default:
1441 abort ();
1444 /* etoasc interprets digits as places after the decimal point.
1445 We interpret digits as total decimal digits, which IMO is
1446 more useful. Since the output will have one digit before
1447 the point, subtract one. */
1448 etoasc (e, s, digits - 1);
1451 /* Compare X and Y. Return 1 if X > Y, 0 if X == Y, -1 if X < Y,
1452 or -2 if either is a NaN. */
1455 ereal_cmp (x, y)
1456 REAL_VALUE_TYPE x, y;
1458 UEMUSHORT ex[NE], ey[NE];
1460 GET_REAL (&x, ex);
1461 GET_REAL (&y, ey);
1462 return (ecmp (ex, ey));
1465 /* Return 1 if the sign bit of X is set, else return 0. */
1468 ereal_isneg (x)
1469 REAL_VALUE_TYPE x;
1471 UEMUSHORT ex[NE];
1473 GET_REAL (&x, ex);
1474 return (eisneg (ex));
1479 Extended precision IEEE binary floating point arithmetic routines
1481 Numbers are stored in C language as arrays of 16-bit unsigned
1482 short integers. The arguments of the routines are pointers to
1483 the arrays.
1485 External e type data structure, similar to Intel 8087 chip
1486 temporary real format but possibly with a larger significand:
1488 NE-1 significand words (least significant word first,
1489 most significant bit is normally set)
1490 exponent (value = EXONE for 1.0,
1491 top bit is the sign)
1494 Internal exploded e-type data structure of a number (a "word" is 16 bits):
1496 ei[0] sign word (0 for positive, 0xffff for negative)
1497 ei[1] biased exponent (value = EXONE for the number 1.0)
1498 ei[2] high guard word (always zero after normalization)
1499 ei[3]
1500 to ei[NI-2] significand (NI-4 significand words,
1501 most significant word first,
1502 most significant bit is set)
1503 ei[NI-1] low guard word (0x8000 bit is rounding place)
1507 Routines for external format e-type numbers
1509 asctoe (string, e) ASCII string to extended double e type
1510 asctoe64 (string, &d) ASCII string to long double
1511 asctoe53 (string, &d) ASCII string to double
1512 asctoe24 (string, &f) ASCII string to single
1513 asctoeg (string, e, prec) ASCII string to specified precision
1514 e24toe (&f, e) IEEE single precision to e type
1515 e53toe (&d, e) IEEE double precision to e type
1516 e64toe (&d, e) IEEE long double precision to e type
1517 e113toe (&d, e) 128-bit long double precision to e type
1518 #if 0
1519 eabs (e) absolute value
1520 #endif
1521 eadd (a, b, c) c = b + a
1522 eclear (e) e = 0
1523 ecmp (a, b) Returns 1 if a > b, 0 if a == b,
1524 -1 if a < b, -2 if either a or b is a NaN.
1525 ediv (a, b, c) c = b / a
1526 efloor (a, b) truncate to integer, toward -infinity
1527 efrexp (a, exp, s) extract exponent and significand
1528 eifrac (e, &l, frac) e to HOST_WIDE_INT and e type fraction
1529 euifrac (e, &l, frac) e to unsigned HOST_WIDE_INT and e type fraction
1530 einfin (e) set e to infinity, leaving its sign alone
1531 eldexp (a, n, b) multiply by 2**n
1532 emov (a, b) b = a
1533 emul (a, b, c) c = b * a
1534 eneg (e) e = -e
1535 #if 0
1536 eround (a, b) b = nearest integer value to a
1537 #endif
1538 esub (a, b, c) c = b - a
1539 #if 0
1540 e24toasc (&f, str, n) single to ASCII string, n digits after decimal
1541 e53toasc (&d, str, n) double to ASCII string, n digits after decimal
1542 e64toasc (&d, str, n) 80-bit long double to ASCII string
1543 e113toasc (&d, str, n) 128-bit long double to ASCII string
1544 #endif
1545 etoasc (e, str, n) e to ASCII string, n digits after decimal
1546 etoe24 (e, &f) convert e type to IEEE single precision
1547 etoe53 (e, &d) convert e type to IEEE double precision
1548 etoe64 (e, &d) convert e type to IEEE long double precision
1549 ltoe (&l, e) HOST_WIDE_INT to e type
1550 ultoe (&l, e) unsigned HOST_WIDE_INT to e type
1551 eisneg (e) 1 if sign bit of e != 0, else 0
1552 eisinf (e) 1 if e has maximum exponent (non-IEEE)
1553 or is infinite (IEEE)
1554 eisnan (e) 1 if e is a NaN
1557 Routines for internal format exploded e-type numbers
1559 eaddm (ai, bi) add significands, bi = bi + ai
1560 ecleaz (ei) ei = 0
1561 ecleazs (ei) set ei = 0 but leave its sign alone
1562 ecmpm (ai, bi) compare significands, return 1, 0, or -1
1563 edivm (ai, bi) divide significands, bi = bi / ai
1564 emdnorm (ai,l,s,exp) normalize and round off
1565 emovi (a, ai) convert external a to internal ai
1566 emovo (ai, a) convert internal ai to external a
1567 emovz (ai, bi) bi = ai, low guard word of bi = 0
1568 emulm (ai, bi) multiply significands, bi = bi * ai
1569 enormlz (ei) left-justify the significand
1570 eshdn1 (ai) shift significand and guards down 1 bit
1571 eshdn8 (ai) shift down 8 bits
1572 eshdn6 (ai) shift down 16 bits
1573 eshift (ai, n) shift ai n bits up (or down if n < 0)
1574 eshup1 (ai) shift significand and guards up 1 bit
1575 eshup8 (ai) shift up 8 bits
1576 eshup6 (ai) shift up 16 bits
1577 esubm (ai, bi) subtract significands, bi = bi - ai
1578 eiisinf (ai) 1 if infinite
1579 eiisnan (ai) 1 if a NaN
1580 eiisneg (ai) 1 if sign bit of ai != 0, else 0
1581 einan (ai) set ai = NaN
1582 #if 0
1583 eiinfin (ai) set ai = infinity
1584 #endif
1586 The result is always normalized and rounded to NI-4 word precision
1587 after each arithmetic operation.
1589 Exception flags are NOT fully supported.
1591 Signaling NaN's are NOT supported; they are treated the same
1592 as quiet NaN's.
1594 Define INFINITY for support of infinity; otherwise a
1595 saturation arithmetic is implemented.
1597 Define NANS for support of Not-a-Number items; otherwise the
1598 arithmetic will never produce a NaN output, and might be confused
1599 by a NaN input.
1600 If NaN's are supported, the output of `ecmp (a,b)' is -2 if
1601 either a or b is a NaN. This means asking `if (ecmp (a,b) < 0)'
1602 may not be legitimate. Use `if (ecmp (a,b) == -1)' for `less than'
1603 if in doubt.
1605 Denormals are always supported here where appropriate (e.g., not
1606 for conversion to DEC numbers). */
1608 /* Definitions for error codes that are passed to the common error handling
1609 routine mtherr.
1611 For Digital Equipment PDP-11 and VAX computers, certain
1612 IBM systems, and others that use numbers with a 56-bit
1613 significand, the symbol DEC should be defined. In this
1614 mode, most floating point constants are given as arrays
1615 of octal integers to eliminate decimal to binary conversion
1616 errors that might be introduced by the compiler.
1618 For computers, such as IBM PC, that follow the IEEE
1619 Standard for Binary Floating Point Arithmetic (ANSI/IEEE
1620 Std 754-1985), the symbol IEEE should be defined.
1621 These numbers have 53-bit significands. In this mode, constants
1622 are provided as arrays of hexadecimal 16 bit integers.
1623 The endian-ness of generated values is controlled by
1624 REAL_WORDS_BIG_ENDIAN.
1626 To accommodate other types of computer arithmetic, all
1627 constants are also provided in a normal decimal radix
1628 which one can hope are correctly converted to a suitable
1629 format by the available C language compiler. To invoke
1630 this mode, the symbol UNK is defined.
1632 An important difference among these modes is a predefined
1633 set of machine arithmetic constants for each. The numbers
1634 MACHEP (the machine roundoff error), MAXNUM (largest number
1635 represented), and several other parameters are preset by
1636 the configuration symbol. Check the file const.c to
1637 ensure that these values are correct for your computer.
1639 For ANSI C compatibility, define ANSIC equal to 1. Currently
1640 this affects only the atan2 function and others that use it. */
1642 /* Constant definitions for math error conditions. */
1644 #define DOMAIN 1 /* argument domain error */
1645 #define SING 2 /* argument singularity */
1646 #define OVERFLOW 3 /* overflow range error */
1647 #define UNDERFLOW 4 /* underflow range error */
1648 #define TLOSS 5 /* total loss of precision */
1649 #define PLOSS 6 /* partial loss of precision */
1650 #define INVALID 7 /* NaN-producing operation */
1652 /* e type constants used by high precision check routines */
1654 #if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && (INTEL_EXTENDED_IEEE_FORMAT == 0)
1655 /* 0.0 */
1656 const UEMUSHORT ezero[NE] =
1657 {0x0000, 0x0000, 0x0000, 0x0000,
1658 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,};
1660 /* 5.0E-1 */
1661 const UEMUSHORT ehalf[NE] =
1662 {0x0000, 0x0000, 0x0000, 0x0000,
1663 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3ffe,};
1665 /* 1.0E0 */
1666 const UEMUSHORT eone[NE] =
1667 {0x0000, 0x0000, 0x0000, 0x0000,
1668 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,};
1670 /* 2.0E0 */
1671 const UEMUSHORT etwo[NE] =
1672 {0x0000, 0x0000, 0x0000, 0x0000,
1673 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000,};
1675 /* 3.2E1 */
1676 const UEMUSHORT e32[NE] =
1677 {0x0000, 0x0000, 0x0000, 0x0000,
1678 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4004,};
1680 /* 6.93147180559945309417232121458176568075500134360255E-1 */
1681 const UEMUSHORT elog2[NE] =
1682 {0x40f3, 0xf6af, 0x03f2, 0xb398,
1683 0xc9e3, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
1685 /* 1.41421356237309504880168872420969807856967187537695E0 */
1686 const UEMUSHORT esqrt2[NE] =
1687 {0x1d6f, 0xbe9f, 0x754a, 0x89b3,
1688 0x597d, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
1690 /* 3.14159265358979323846264338327950288419716939937511E0 */
1691 const UEMUSHORT epi[NE] =
1692 {0x2902, 0x1cd1, 0x80dc, 0x628b,
1693 0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
1695 #else
1696 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
1697 const UEMUSHORT ezero[NE] =
1698 {0, 0000000, 0000000, 0000000, 0000000, 0000000,};
1699 const UEMUSHORT ehalf[NE] =
1700 {0, 0000000, 0000000, 0000000, 0100000, 0x3ffe,};
1701 const UEMUSHORT eone[NE] =
1702 {0, 0000000, 0000000, 0000000, 0100000, 0x3fff,};
1703 const UEMUSHORT etwo[NE] =
1704 {0, 0000000, 0000000, 0000000, 0100000, 0040000,};
1705 const UEMUSHORT e32[NE] =
1706 {0, 0000000, 0000000, 0000000, 0100000, 0040004,};
1707 const UEMUSHORT elog2[NE] =
1708 {0xc9e4, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
1709 const UEMUSHORT esqrt2[NE] =
1710 {0x597e, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
1711 const UEMUSHORT epi[NE] =
1712 {0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
1713 #endif
1715 /* Control register for rounding precision.
1716 This can be set to 113 (if NE=10), 80 (if NE=6), 64, 56, 53, or 24 bits. */
1718 int rndprc = NBITS;
1719 extern int rndprc;
1721 /* Clear out entire e-type number X. */
1723 static void
1724 eclear (x)
1725 UEMUSHORT *x;
1727 int i;
1729 for (i = 0; i < NE; i++)
1730 *x++ = 0;
1733 /* Move e-type number from A to B. */
1735 static void
1736 emov (a, b)
1737 const UEMUSHORT *a;
1738 UEMUSHORT *b;
1740 int i;
1742 for (i = 0; i < NE; i++)
1743 *b++ = *a++;
1747 #if 0
1748 /* Absolute value of e-type X. */
1750 static void
1751 eabs (x)
1752 UEMUSHORT x[];
1754 /* sign is top bit of last word of external format */
1755 x[NE - 1] &= 0x7fff;
1757 #endif /* 0 */
1759 /* Negate the e-type number X. */
1761 static void
1762 eneg (x)
1763 UEMUSHORT x[];
1766 x[NE - 1] ^= 0x8000; /* Toggle the sign bit */
1769 /* Return 1 if sign bit of e-type number X is nonzero, else zero. */
1771 static int
1772 eisneg (x)
1773 const UEMUSHORT x[];
1776 if (x[NE - 1] & 0x8000)
1777 return (1);
1778 else
1779 return (0);
1782 /* Return 1 if e-type number X is infinity, else return zero. */
1784 static int
1785 eisinf (x)
1786 const UEMUSHORT x[];
1789 #ifdef NANS
1790 if (eisnan (x))
1791 return (0);
1792 #endif
1793 if ((x[NE - 1] & 0x7fff) == 0x7fff)
1794 return (1);
1795 else
1796 return (0);
1799 /* Check if e-type number is not a number. The bit pattern is one that we
1800 defined, so we know for sure how to detect it. */
1802 static int
1803 eisnan (x)
1804 const UEMUSHORT x[] ATTRIBUTE_UNUSED;
1806 #ifdef NANS
1807 int i;
1809 /* NaN has maximum exponent */
1810 if ((x[NE - 1] & 0x7fff) != 0x7fff)
1811 return (0);
1812 /* ... and non-zero significand field. */
1813 for (i = 0; i < NE - 1; i++)
1815 if (*x++ != 0)
1816 return (1);
1818 #endif
1820 return (0);
1823 /* Fill e-type number X with infinity pattern (IEEE)
1824 or largest possible number (non-IEEE). */
1826 static void
1827 einfin (x)
1828 UEMUSHORT *x;
1830 int i;
1832 #ifdef INFINITY
1833 for (i = 0; i < NE - 1; i++)
1834 *x++ = 0;
1835 *x |= 32767;
1836 #else
1837 for (i = 0; i < NE - 1; i++)
1838 *x++ = 0xffff;
1839 *x |= 32766;
1840 if (rndprc < NBITS)
1842 if (rndprc == 113)
1844 *(x - 9) = 0;
1845 *(x - 8) = 0;
1847 if (rndprc == 64)
1849 *(x - 5) = 0;
1851 if (rndprc == 53)
1853 *(x - 4) = 0xf800;
1855 else
1857 *(x - 4) = 0;
1858 *(x - 3) = 0;
1859 *(x - 2) = 0xff00;
1862 #endif
1865 /* Similar, except return it as a REAL_VALUE_TYPE. */
1867 REAL_VALUE_TYPE
1868 ereal_inf (mode)
1869 enum machine_mode mode;
1871 REAL_VALUE_TYPE r;
1872 UEMUSHORT e[NE];
1873 int prec, rndsav;
1875 switch (mode)
1877 case QFmode:
1878 case SFmode:
1879 prec = 24;
1880 break;
1881 case HFmode:
1882 case DFmode:
1883 prec = 53;
1884 break;
1885 case TFmode:
1886 if (!INTEL_EXTENDED_IEEE_FORMAT)
1888 prec = 113;
1889 break;
1891 /* FALLTHRU */
1892 case XFmode:
1893 prec = 64;
1894 break;
1895 default:
1896 abort ();
1899 rndsav = rndprc;
1900 rndprc = prec;
1901 eclear (e);
1902 einfin (e);
1903 rndprc = rndsav;
1905 PUT_REAL (e, &r);
1906 return r;
1909 /* Output an e-type NaN.
1910 This generates Intel's quiet NaN pattern for extended real.
1911 The exponent is 7fff, the leading mantissa word is c000. */
1913 #ifdef NANS
1914 static void
1915 enan (x, sign)
1916 UEMUSHORT *x;
1917 int sign;
1919 int i;
1921 for (i = 0; i < NE - 2; i++)
1922 *x++ = 0;
1923 *x++ = 0xc000;
1924 *x = (sign << 15) | 0x7fff;
1926 #endif /* NANS */
1928 /* Move in an e-type number A, converting it to exploded e-type B. */
1930 static void
1931 emovi (a, b)
1932 const UEMUSHORT *a;
1933 UEMUSHORT *b;
1935 const UEMUSHORT *p;
1936 UEMUSHORT *q;
1937 int i;
1939 q = b;
1940 p = a + (NE - 1); /* point to last word of external number */
1941 /* get the sign bit */
1942 if (*p & 0x8000)
1943 *q++ = 0xffff;
1944 else
1945 *q++ = 0;
1946 /* get the exponent */
1947 *q = *p--;
1948 *q++ &= 0x7fff; /* delete the sign bit */
1949 #ifdef INFINITY
1950 if ((*(q - 1) & 0x7fff) == 0x7fff)
1952 #ifdef NANS
1953 if (eisnan (a))
1955 *q++ = 0;
1956 for (i = 3; i < NI; i++)
1957 *q++ = *p--;
1958 return;
1960 #endif
1962 for (i = 2; i < NI; i++)
1963 *q++ = 0;
1964 return;
1966 #endif
1968 /* clear high guard word */
1969 *q++ = 0;
1970 /* move in the significand */
1971 for (i = 0; i < NE - 1; i++)
1972 *q++ = *p--;
1973 /* clear low guard word */
1974 *q = 0;
1977 /* Move out exploded e-type number A, converting it to e type B. */
1979 static void
1980 emovo (a, b)
1981 const UEMUSHORT *a;
1982 UEMUSHORT *b;
1984 const UEMUSHORT *p;
1985 UEMUSHORT *q;
1986 UEMUSHORT i;
1987 int j;
1989 p = a;
1990 q = b + (NE - 1); /* point to output exponent */
1991 /* combine sign and exponent */
1992 i = *p++;
1993 if (i)
1994 *q-- = *p++ | 0x8000;
1995 else
1996 *q-- = *p++;
1997 #ifdef INFINITY
1998 if (*(p - 1) == 0x7fff)
2000 #ifdef NANS
2001 if (eiisnan (a))
2003 enan (b, eiisneg (a));
2004 return;
2006 #endif
2007 einfin (b);
2008 return;
2010 #endif
2011 /* skip over guard word */
2012 ++p;
2013 /* move the significand */
2014 for (j = 0; j < NE - 1; j++)
2015 *q-- = *p++;
2018 /* Clear out exploded e-type number XI. */
2020 static void
2021 ecleaz (xi)
2022 UEMUSHORT *xi;
2024 int i;
2026 for (i = 0; i < NI; i++)
2027 *xi++ = 0;
2030 /* Clear out exploded e-type XI, but don't touch the sign. */
2032 static void
2033 ecleazs (xi)
2034 UEMUSHORT *xi;
2036 int i;
2038 ++xi;
2039 for (i = 0; i < NI - 1; i++)
2040 *xi++ = 0;
2043 /* Move exploded e-type number from A to B. */
2045 static void
2046 emovz (a, b)
2047 const UEMUSHORT *a;
2048 UEMUSHORT *b;
2050 int i;
2052 for (i = 0; i < NI - 1; i++)
2053 *b++ = *a++;
2054 /* clear low guard word */
2055 *b = 0;
2058 /* Generate exploded e-type NaN.
2059 The explicit pattern for this is maximum exponent and
2060 top two significant bits set. */
2062 #ifdef NANS
2063 static void
2064 einan (x)
2065 UEMUSHORT x[];
2068 ecleaz (x);
2069 x[E] = 0x7fff;
2070 x[M + 1] = 0xc000;
2072 #endif /* NANS */
2074 /* Return nonzero if exploded e-type X is a NaN. */
2076 #ifdef NANS
2077 static int
2078 eiisnan (x)
2079 const UEMUSHORT x[];
2081 int i;
2083 if ((x[E] & 0x7fff) == 0x7fff)
2085 for (i = M + 1; i < NI; i++)
2087 if (x[i] != 0)
2088 return (1);
2091 return (0);
2093 #endif /* NANS */
2095 /* Return nonzero if sign of exploded e-type X is nonzero. */
2097 static int
2098 eiisneg (x)
2099 const UEMUSHORT x[];
2102 return x[0] != 0;
2105 #if 0
2106 /* Fill exploded e-type X with infinity pattern.
2107 This has maximum exponent and significand all zeros. */
2109 static void
2110 eiinfin (x)
2111 UEMUSHORT x[];
2114 ecleaz (x);
2115 x[E] = 0x7fff;
2117 #endif /* 0 */
2119 /* Return nonzero if exploded e-type X is infinite. */
2121 #ifdef INFINITY
2122 static int
2123 eiisinf (x)
2124 const UEMUSHORT x[];
2127 #ifdef NANS
2128 if (eiisnan (x))
2129 return (0);
2130 #endif
2131 if ((x[E] & 0x7fff) == 0x7fff)
2132 return (1);
2133 return (0);
2135 #endif /* INFINITY */
2137 /* Compare significands of numbers in internal exploded e-type format.
2138 Guard words are included in the comparison.
2140 Returns +1 if a > b
2141 0 if a == b
2142 -1 if a < b */
2144 static int
2145 ecmpm (a, b)
2146 const UEMUSHORT *a, *b;
2148 int i;
2150 a += M; /* skip up to significand area */
2151 b += M;
2152 for (i = M; i < NI; i++)
2154 if (*a++ != *b++)
2155 goto difrnt;
2157 return (0);
2159 difrnt:
2160 if (*(--a) > *(--b))
2161 return (1);
2162 else
2163 return (-1);
2166 /* Shift significand of exploded e-type X down by 1 bit. */
2168 static void
2169 eshdn1 (x)
2170 UEMUSHORT *x;
2172 UEMUSHORT bits;
2173 int i;
2175 x += M; /* point to significand area */
2177 bits = 0;
2178 for (i = M; i < NI; i++)
2180 if (*x & 1)
2181 bits |= 1;
2182 *x >>= 1;
2183 if (bits & 2)
2184 *x |= 0x8000;
2185 bits <<= 1;
2186 ++x;
2190 /* Shift significand of exploded e-type X up by 1 bit. */
2192 static void
2193 eshup1 (x)
2194 UEMUSHORT *x;
2196 UEMUSHORT bits;
2197 int i;
2199 x += NI - 1;
2200 bits = 0;
2202 for (i = M; i < NI; i++)
2204 if (*x & 0x8000)
2205 bits |= 1;
2206 *x <<= 1;
2207 if (bits & 2)
2208 *x |= 1;
2209 bits <<= 1;
2210 --x;
2215 /* Shift significand of exploded e-type X down by 8 bits. */
2217 static void
2218 eshdn8 (x)
2219 UEMUSHORT *x;
2221 UEMUSHORT newbyt, oldbyt;
2222 int i;
2224 x += M;
2225 oldbyt = 0;
2226 for (i = M; i < NI; i++)
2228 newbyt = *x << 8;
2229 *x >>= 8;
2230 *x |= oldbyt;
2231 oldbyt = newbyt;
2232 ++x;
2236 /* Shift significand of exploded e-type X up by 8 bits. */
2238 static void
2239 eshup8 (x)
2240 UEMUSHORT *x;
2242 int i;
2243 UEMUSHORT newbyt, oldbyt;
2245 x += NI - 1;
2246 oldbyt = 0;
2248 for (i = M; i < NI; i++)
2250 newbyt = *x >> 8;
2251 *x <<= 8;
2252 *x |= oldbyt;
2253 oldbyt = newbyt;
2254 --x;
2258 /* Shift significand of exploded e-type X up by 16 bits. */
2260 static void
2261 eshup6 (x)
2262 UEMUSHORT *x;
2264 int i;
2265 UEMUSHORT *p;
2267 p = x + M;
2268 x += M + 1;
2270 for (i = M; i < NI - 1; i++)
2271 *p++ = *x++;
2273 *p = 0;
2276 /* Shift significand of exploded e-type X down by 16 bits. */
2278 static void
2279 eshdn6 (x)
2280 UEMUSHORT *x;
2282 int i;
2283 UEMUSHORT *p;
2285 x += NI - 1;
2286 p = x + 1;
2288 for (i = M; i < NI - 1; i++)
2289 *(--p) = *(--x);
2291 *(--p) = 0;
2294 /* Add significands of exploded e-type X and Y. X + Y replaces Y. */
2296 static void
2297 eaddm (x, y)
2298 const UEMUSHORT *x;
2299 UEMUSHORT *y;
2301 unsigned EMULONG a;
2302 int i;
2303 unsigned int carry;
2305 x += NI - 1;
2306 y += NI - 1;
2307 carry = 0;
2308 for (i = M; i < NI; i++)
2310 a = (unsigned EMULONG) (*x) + (unsigned EMULONG) (*y) + carry;
2311 if (a & 0x10000)
2312 carry = 1;
2313 else
2314 carry = 0;
2315 *y = (UEMUSHORT) a;
2316 --x;
2317 --y;
2321 /* Subtract significands of exploded e-type X and Y. Y - X replaces Y. */
2323 static void
2324 esubm (x, y)
2325 const UEMUSHORT *x;
2326 UEMUSHORT *y;
2328 unsigned EMULONG a;
2329 int i;
2330 unsigned int carry;
2332 x += NI - 1;
2333 y += NI - 1;
2334 carry = 0;
2335 for (i = M; i < NI; i++)
2337 a = (unsigned EMULONG) (*y) - (unsigned EMULONG) (*x) - carry;
2338 if (a & 0x10000)
2339 carry = 1;
2340 else
2341 carry = 0;
2342 *y = (UEMUSHORT) a;
2343 --x;
2344 --y;
2349 static UEMUSHORT equot[NI];
2352 #if 0
2353 /* Radix 2 shift-and-add versions of multiply and divide */
2356 /* Divide significands */
2359 edivm (den, num)
2360 UEMUSHORT den[], num[];
2362 int i;
2363 UEMUSHORT *p, *q;
2364 UEMUSHORT j;
2366 p = &equot[0];
2367 *p++ = num[0];
2368 *p++ = num[1];
2370 for (i = M; i < NI; i++)
2372 *p++ = 0;
2375 /* Use faster compare and subtraction if denominator has only 15 bits of
2376 significance. */
2378 p = &den[M + 2];
2379 if (*p++ == 0)
2381 for (i = M + 3; i < NI; i++)
2383 if (*p++ != 0)
2384 goto fulldiv;
2386 if ((den[M + 1] & 1) != 0)
2387 goto fulldiv;
2388 eshdn1 (num);
2389 eshdn1 (den);
2391 p = &den[M + 1];
2392 q = &num[M + 1];
2394 for (i = 0; i < NBITS + 2; i++)
2396 if (*p <= *q)
2398 *q -= *p;
2399 j = 1;
2401 else
2403 j = 0;
2405 eshup1 (equot);
2406 equot[NI - 2] |= j;
2407 eshup1 (num);
2409 goto divdon;
2412 /* The number of quotient bits to calculate is NBITS + 1 scaling guard
2413 bit + 1 roundoff bit. */
2415 fulldiv:
2417 p = &equot[NI - 2];
2418 for (i = 0; i < NBITS + 2; i++)
2420 if (ecmpm (den, num) <= 0)
2422 esubm (den, num);
2423 j = 1; /* quotient bit = 1 */
2425 else
2426 j = 0;
2427 eshup1 (equot);
2428 *p |= j;
2429 eshup1 (num);
2432 divdon:
2434 eshdn1 (equot);
2435 eshdn1 (equot);
2437 /* test for nonzero remainder after roundoff bit */
2438 p = &num[M];
2439 j = 0;
2440 for (i = M; i < NI; i++)
2442 j |= *p++;
2444 if (j)
2445 j = 1;
2448 for (i = 0; i < NI; i++)
2449 num[i] = equot[i];
2450 return ((int) j);
2454 /* Multiply significands */
2457 emulm (a, b)
2458 UEMUSHORT a[], b[];
2460 UEMUSHORT *p, *q;
2461 int i, j, k;
2463 equot[0] = b[0];
2464 equot[1] = b[1];
2465 for (i = M; i < NI; i++)
2466 equot[i] = 0;
2468 p = &a[NI - 2];
2469 k = NBITS;
2470 while (*p == 0) /* significand is not supposed to be zero */
2472 eshdn6 (a);
2473 k -= 16;
2475 if ((*p & 0xff) == 0)
2477 eshdn8 (a);
2478 k -= 8;
2481 q = &equot[NI - 1];
2482 j = 0;
2483 for (i = 0; i < k; i++)
2485 if (*p & 1)
2486 eaddm (b, equot);
2487 /* remember if there were any nonzero bits shifted out */
2488 if (*q & 1)
2489 j |= 1;
2490 eshdn1 (a);
2491 eshdn1 (equot);
2494 for (i = 0; i < NI; i++)
2495 b[i] = equot[i];
2497 /* return flag for lost nonzero bits */
2498 return (j);
2501 #else
2503 /* Radix 65536 versions of multiply and divide. */
2505 /* Multiply significand of e-type number B
2506 by 16-bit quantity A, return e-type result to C. */
2508 static void
2509 m16m (a, b, c)
2510 unsigned int a;
2511 const UEMUSHORT b[];
2512 UEMUSHORT c[];
2514 UEMUSHORT *pp;
2515 unsigned EMULONG carry;
2516 const UEMUSHORT *ps;
2517 UEMUSHORT p[NI];
2518 unsigned EMULONG aa, m;
2519 int i;
2521 aa = a;
2522 pp = &p[NI-2];
2523 *pp++ = 0;
2524 *pp = 0;
2525 ps = &b[NI-1];
2527 for (i=M+1; i<NI; i++)
2529 if (*ps == 0)
2531 --ps;
2532 --pp;
2533 *(pp-1) = 0;
2535 else
2537 m = (unsigned EMULONG) aa * *ps--;
2538 carry = (m & 0xffff) + *pp;
2539 *pp-- = (UEMUSHORT) carry;
2540 carry = (carry >> 16) + (m >> 16) + *pp;
2541 *pp = (UEMUSHORT) carry;
2542 *(pp-1) = carry >> 16;
2545 for (i=M; i<NI; i++)
2546 c[i] = p[i];
2549 /* Divide significands of exploded e-types NUM / DEN. Neither the
2550 numerator NUM nor the denominator DEN is permitted to have its high guard
2551 word nonzero. */
2553 static int
2554 edivm (den, num)
2555 const UEMUSHORT den[];
2556 UEMUSHORT num[];
2558 int i;
2559 UEMUSHORT *p;
2560 unsigned EMULONG tnum;
2561 UEMUSHORT j, tdenm, tquot;
2562 UEMUSHORT tprod[NI+1];
2564 p = &equot[0];
2565 *p++ = num[0];
2566 *p++ = num[1];
2568 for (i=M; i<NI; i++)
2570 *p++ = 0;
2572 eshdn1 (num);
2573 tdenm = den[M+1];
2574 for (i=M; i<NI; i++)
2576 /* Find trial quotient digit (the radix is 65536). */
2577 tnum = (((unsigned EMULONG) num[M]) << 16) + num[M+1];
2579 /* Do not execute the divide instruction if it will overflow. */
2580 if ((tdenm * (unsigned long) 0xffff) < tnum)
2581 tquot = 0xffff;
2582 else
2583 tquot = tnum / tdenm;
2584 /* Multiply denominator by trial quotient digit. */
2585 m16m ((unsigned int) tquot, den, tprod);
2586 /* The quotient digit may have been overestimated. */
2587 if (ecmpm (tprod, num) > 0)
2589 tquot -= 1;
2590 esubm (den, tprod);
2591 if (ecmpm (tprod, num) > 0)
2593 tquot -= 1;
2594 esubm (den, tprod);
2597 esubm (tprod, num);
2598 equot[i] = tquot;
2599 eshup6 (num);
2601 /* test for nonzero remainder after roundoff bit */
2602 p = &num[M];
2603 j = 0;
2604 for (i=M; i<NI; i++)
2606 j |= *p++;
2608 if (j)
2609 j = 1;
2611 for (i=0; i<NI; i++)
2612 num[i] = equot[i];
2614 return ((int) j);
2617 /* Multiply significands of exploded e-type A and B, result in B. */
2619 static int
2620 emulm (a, b)
2621 const UEMUSHORT a[];
2622 UEMUSHORT b[];
2624 const UEMUSHORT *p;
2625 UEMUSHORT *q;
2626 UEMUSHORT pprod[NI];
2627 UEMUSHORT j;
2628 int i;
2630 equot[0] = b[0];
2631 equot[1] = b[1];
2632 for (i=M; i<NI; i++)
2633 equot[i] = 0;
2635 j = 0;
2636 p = &a[NI-1];
2637 q = &equot[NI-1];
2638 for (i=M+1; i<NI; i++)
2640 if (*p == 0)
2642 --p;
2644 else
2646 m16m ((unsigned int) *p--, b, pprod);
2647 eaddm (pprod, equot);
2649 j |= *q;
2650 eshdn6 (equot);
2653 for (i=0; i<NI; i++)
2654 b[i] = equot[i];
2656 /* return flag for lost nonzero bits */
2657 return ((int) j);
2659 #endif
2662 /* Normalize and round off.
2664 The internal format number to be rounded is S.
2665 Input LOST is 0 if the value is exact. This is the so-called sticky bit.
2667 Input SUBFLG indicates whether the number was obtained
2668 by a subtraction operation. In that case if LOST is nonzero
2669 then the number is slightly smaller than indicated.
2671 Input EXP is the biased exponent, which may be negative.
2672 the exponent field of S is ignored but is replaced by
2673 EXP as adjusted by normalization and rounding.
2675 Input RCNTRL is the rounding control. If it is nonzero, the
2676 returned value will be rounded to RNDPRC bits.
2678 For future reference: In order for emdnorm to round off denormal
2679 significands at the right point, the input exponent must be
2680 adjusted to be the actual value it would have after conversion to
2681 the final floating point type. This adjustment has been
2682 implemented for all type conversions (etoe53, etc.) and decimal
2683 conversions, but not for the arithmetic functions (eadd, etc.).
2684 Data types having standard 15-bit exponents are not affected by
2685 this, but SFmode and DFmode are affected. For example, ediv with
2686 rndprc = 24 will not round correctly to 24-bit precision if the
2687 result is denormal. */
2689 static int rlast = -1;
2690 static int rw = 0;
2691 static UEMUSHORT rmsk = 0;
2692 static UEMUSHORT rmbit = 0;
2693 static UEMUSHORT rebit = 0;
2694 static int re = 0;
2695 static UEMUSHORT rbit[NI];
2697 static void
2698 emdnorm (s, lost, subflg, exp, rcntrl)
2699 UEMUSHORT s[];
2700 int lost;
2701 int subflg ATTRIBUTE_UNUSED;
2702 EMULONG exp;
2703 int rcntrl;
2705 int i, j;
2706 UEMUSHORT r;
2708 /* Normalize */
2709 j = enormlz (s);
2711 /* a blank significand could mean either zero or infinity. */
2712 #ifndef INFINITY
2713 if (j > NBITS)
2715 ecleazs (s);
2716 return;
2718 #endif
2719 exp -= j;
2720 #ifndef INFINITY
2721 if (exp >= 32767L)
2722 goto overf;
2723 #else
2724 if ((j > NBITS) && (exp < 32767))
2726 ecleazs (s);
2727 return;
2729 #endif
2730 if (exp < 0L)
2732 if (exp > (EMULONG) (-NBITS - 1))
2734 j = (int) exp;
2735 i = eshift (s, j);
2736 if (i)
2737 lost = 1;
2739 else
2741 ecleazs (s);
2742 return;
2745 /* Round off, unless told not to by rcntrl. */
2746 if (rcntrl == 0)
2747 goto mdfin;
2748 /* Set up rounding parameters if the control register changed. */
2749 if (rndprc != rlast)
2751 ecleaz (rbit);
2752 switch (rndprc)
2754 default:
2755 case NBITS:
2756 rw = NI - 1; /* low guard word */
2757 rmsk = 0xffff;
2758 rmbit = 0x8000;
2759 re = rw - 1;
2760 rebit = 1;
2761 break;
2763 case 113:
2764 rw = 10;
2765 rmsk = 0x7fff;
2766 rmbit = 0x4000;
2767 rebit = 0x8000;
2768 re = rw;
2769 break;
2771 case 64:
2772 rw = 7;
2773 rmsk = 0xffff;
2774 rmbit = 0x8000;
2775 re = rw - 1;
2776 rebit = 1;
2777 break;
2779 /* For DEC or IBM arithmetic */
2780 case 56:
2781 rw = 6;
2782 rmsk = 0xff;
2783 rmbit = 0x80;
2784 rebit = 0x100;
2785 re = rw;
2786 break;
2788 case 53:
2789 rw = 6;
2790 rmsk = 0x7ff;
2791 rmbit = 0x0400;
2792 rebit = 0x800;
2793 re = rw;
2794 break;
2796 /* For C4x arithmetic */
2797 case 32:
2798 rw = 5;
2799 rmsk = 0xffff;
2800 rmbit = 0x8000;
2801 rebit = 1;
2802 re = rw - 1;
2803 break;
2805 case 24:
2806 rw = 4;
2807 rmsk = 0xff;
2808 rmbit = 0x80;
2809 rebit = 0x100;
2810 re = rw;
2811 break;
2813 rbit[re] = rebit;
2814 rlast = rndprc;
2817 /* Shift down 1 temporarily if the data structure has an implied
2818 most significant bit and the number is denormal.
2819 Intel long double denormals also lose one bit of precision. */
2820 if ((exp <= 0) && (rndprc != NBITS)
2821 && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN)))
2823 lost |= s[NI - 1] & 1;
2824 eshdn1 (s);
2826 /* Clear out all bits below the rounding bit,
2827 remembering in r if any were nonzero. */
2828 r = s[rw] & rmsk;
2829 if (rndprc < NBITS)
2831 i = rw + 1;
2832 while (i < NI)
2834 if (s[i])
2835 r |= 1;
2836 s[i] = 0;
2837 ++i;
2840 s[rw] &= ~rmsk;
2841 if ((r & rmbit) != 0)
2843 #ifndef C4X
2844 if (r == rmbit)
2846 if (lost == 0)
2847 { /* round to even */
2848 if ((s[re] & rebit) == 0)
2849 goto mddone;
2851 else
2853 if (subflg != 0)
2854 goto mddone;
2857 #endif
2858 eaddm (rbit, s);
2860 #ifndef C4X
2861 mddone:
2862 #endif
2863 /* Undo the temporary shift for denormal values. */
2864 if ((exp <= 0) && (rndprc != NBITS)
2865 && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN)))
2867 eshup1 (s);
2869 if (s[2] != 0)
2870 { /* overflow on roundoff */
2871 eshdn1 (s);
2872 exp += 1;
2874 mdfin:
2875 s[NI - 1] = 0;
2876 if (exp >= 32767L)
2878 #ifndef INFINITY
2879 overf:
2880 #endif
2881 #ifdef INFINITY
2882 s[1] = 32767;
2883 for (i = 2; i < NI - 1; i++)
2884 s[i] = 0;
2885 if (extra_warnings)
2886 warning ("floating point overflow");
2887 #else
2888 s[1] = 32766;
2889 s[2] = 0;
2890 for (i = M + 1; i < NI - 1; i++)
2891 s[i] = 0xffff;
2892 s[NI - 1] = 0;
2893 if ((rndprc < 64) || (rndprc == 113))
2895 s[rw] &= ~rmsk;
2896 if (rndprc == 24)
2898 s[5] = 0;
2899 s[6] = 0;
2902 #endif
2903 return;
2905 if (exp < 0)
2906 s[1] = 0;
2907 else
2908 s[1] = (UEMUSHORT) exp;
2911 /* Subtract. C = B - A, all e type numbers. */
2913 static int subflg = 0;
2915 static void
2916 esub (a, b, c)
2917 const UEMUSHORT *a, *b;
2918 UEMUSHORT *c;
2921 #ifdef NANS
2922 if (eisnan (a))
2924 emov (a, c);
2925 return;
2927 if (eisnan (b))
2929 emov (b, c);
2930 return;
2932 /* Infinity minus infinity is a NaN.
2933 Test for subtracting infinities of the same sign. */
2934 if (eisinf (a) && eisinf (b)
2935 && ((eisneg (a) ^ eisneg (b)) == 0))
2937 mtherr ("esub", INVALID);
2938 enan (c, 0);
2939 return;
2941 #endif
2942 subflg = 1;
2943 eadd1 (a, b, c);
2946 /* Add. C = A + B, all e type. */
2948 static void
2949 eadd (a, b, c)
2950 const UEMUSHORT *a, *b;
2951 UEMUSHORT *c;
2954 #ifdef NANS
2955 /* NaN plus anything is a NaN. */
2956 if (eisnan (a))
2958 emov (a, c);
2959 return;
2961 if (eisnan (b))
2963 emov (b, c);
2964 return;
2966 /* Infinity minus infinity is a NaN.
2967 Test for adding infinities of opposite signs. */
2968 if (eisinf (a) && eisinf (b)
2969 && ((eisneg (a) ^ eisneg (b)) != 0))
2971 mtherr ("esub", INVALID);
2972 enan (c, 0);
2973 return;
2975 #endif
2976 subflg = 0;
2977 eadd1 (a, b, c);
2980 /* Arithmetic common to both addition and subtraction. */
2982 static void
2983 eadd1 (a, b, c)
2984 const UEMUSHORT *a, *b;
2985 UEMUSHORT *c;
2987 UEMUSHORT ai[NI], bi[NI], ci[NI];
2988 int i, lost, j, k;
2989 EMULONG lt, lta, ltb;
2991 #ifdef INFINITY
2992 if (eisinf (a))
2994 emov (a, c);
2995 if (subflg)
2996 eneg (c);
2997 return;
2999 if (eisinf (b))
3001 emov (b, c);
3002 return;
3004 #endif
3005 emovi (a, ai);
3006 emovi (b, bi);
3007 if (subflg)
3008 ai[0] = ~ai[0];
3010 /* compare exponents */
3011 lta = ai[E];
3012 ltb = bi[E];
3013 lt = lta - ltb;
3014 if (lt > 0L)
3015 { /* put the larger number in bi */
3016 emovz (bi, ci);
3017 emovz (ai, bi);
3018 emovz (ci, ai);
3019 ltb = bi[E];
3020 lt = -lt;
3022 lost = 0;
3023 if (lt != 0L)
3025 if (lt < (EMULONG) (-NBITS - 1))
3026 goto done; /* answer same as larger addend */
3027 k = (int) lt;
3028 lost = eshift (ai, k); /* shift the smaller number down */
3030 else
3032 /* exponents were the same, so must compare significands */
3033 i = ecmpm (ai, bi);
3034 if (i == 0)
3035 { /* the numbers are identical in magnitude */
3036 /* if different signs, result is zero */
3037 if (ai[0] != bi[0])
3039 eclear (c);
3040 return;
3042 /* if same sign, result is double */
3043 /* double denormalized tiny number */
3044 if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0))
3046 eshup1 (bi);
3047 goto done;
3049 /* add 1 to exponent unless both are zero! */
3050 for (j = 1; j < NI - 1; j++)
3052 if (bi[j] != 0)
3054 ltb += 1;
3055 if (ltb >= 0x7fff)
3057 eclear (c);
3058 if (ai[0] != 0)
3059 eneg (c);
3060 einfin (c);
3061 return;
3063 break;
3066 bi[E] = (UEMUSHORT) ltb;
3067 goto done;
3069 if (i > 0)
3070 { /* put the larger number in bi */
3071 emovz (bi, ci);
3072 emovz (ai, bi);
3073 emovz (ci, ai);
3076 if (ai[0] == bi[0])
3078 eaddm (ai, bi);
3079 subflg = 0;
3081 else
3083 esubm (ai, bi);
3084 subflg = 1;
3086 emdnorm (bi, lost, subflg, ltb, !ROUND_TOWARDS_ZERO);
3088 done:
3089 emovo (bi, c);
3092 /* Divide: C = B/A, all e type. */
3094 static void
3095 ediv (a, b, c)
3096 const UEMUSHORT *a, *b;
3097 UEMUSHORT *c;
3099 UEMUSHORT ai[NI], bi[NI];
3100 int i, sign;
3101 EMULONG lt, lta, ltb;
3103 /* IEEE says if result is not a NaN, the sign is "-" if and only if
3104 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
3105 sign = eisneg (a) ^ eisneg (b);
3107 #ifdef NANS
3108 /* Return any NaN input. */
3109 if (eisnan (a))
3111 emov (a, c);
3112 return;
3114 if (eisnan (b))
3116 emov (b, c);
3117 return;
3119 /* Zero over zero, or infinity over infinity, is a NaN. */
3120 if (((ecmp (a, ezero) == 0) && (ecmp (b, ezero) == 0))
3121 || (eisinf (a) && eisinf (b)))
3123 mtherr ("ediv", INVALID);
3124 enan (c, sign);
3125 return;
3127 #endif
3128 /* Infinity over anything else is infinity. */
3129 #ifdef INFINITY
3130 if (eisinf (b))
3132 einfin (c);
3133 goto divsign;
3135 /* Anything else over infinity is zero. */
3136 if (eisinf (a))
3138 eclear (c);
3139 goto divsign;
3141 #endif
3142 emovi (a, ai);
3143 emovi (b, bi);
3144 lta = ai[E];
3145 ltb = bi[E];
3146 if (bi[E] == 0)
3147 { /* See if numerator is zero. */
3148 for (i = 1; i < NI - 1; i++)
3150 if (bi[i] != 0)
3152 ltb -= enormlz (bi);
3153 goto dnzro1;
3156 eclear (c);
3157 goto divsign;
3159 dnzro1:
3161 if (ai[E] == 0)
3162 { /* possible divide by zero */
3163 for (i = 1; i < NI - 1; i++)
3165 if (ai[i] != 0)
3167 lta -= enormlz (ai);
3168 goto dnzro2;
3171 /* Divide by zero is not an invalid operation.
3172 It is a divide-by-zero operation! */
3173 einfin (c);
3174 mtherr ("ediv", SING);
3175 goto divsign;
3177 dnzro2:
3179 i = edivm (ai, bi);
3180 /* calculate exponent */
3181 lt = ltb - lta + EXONE;
3182 emdnorm (bi, i, 0, lt, !ROUND_TOWARDS_ZERO);
3183 emovo (bi, c);
3185 divsign:
3187 if (sign
3188 #ifndef IEEE
3189 && (ecmp (c, ezero) != 0)
3190 #endif
3192 *(c+(NE-1)) |= 0x8000;
3193 else
3194 *(c+(NE-1)) &= ~0x8000;
3197 /* Multiply e-types A and B, return e-type product C. */
3199 static void
3200 emul (a, b, c)
3201 const UEMUSHORT *a, *b;
3202 UEMUSHORT *c;
3204 UEMUSHORT ai[NI], bi[NI];
3205 int i, j, sign;
3206 EMULONG lt, lta, ltb;
3208 /* IEEE says if result is not a NaN, the sign is "-" if and only if
3209 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
3210 sign = eisneg (a) ^ eisneg (b);
3212 #ifdef NANS
3213 /* NaN times anything is the same NaN. */
3214 if (eisnan (a))
3216 emov (a, c);
3217 return;
3219 if (eisnan (b))
3221 emov (b, c);
3222 return;
3224 /* Zero times infinity is a NaN. */
3225 if ((eisinf (a) && (ecmp (b, ezero) == 0))
3226 || (eisinf (b) && (ecmp (a, ezero) == 0)))
3228 mtherr ("emul", INVALID);
3229 enan (c, sign);
3230 return;
3232 #endif
3233 /* Infinity times anything else is infinity. */
3234 #ifdef INFINITY
3235 if (eisinf (a) || eisinf (b))
3237 einfin (c);
3238 goto mulsign;
3240 #endif
3241 emovi (a, ai);
3242 emovi (b, bi);
3243 lta = ai[E];
3244 ltb = bi[E];
3245 if (ai[E] == 0)
3247 for (i = 1; i < NI - 1; i++)
3249 if (ai[i] != 0)
3251 lta -= enormlz (ai);
3252 goto mnzer1;
3255 eclear (c);
3256 goto mulsign;
3258 mnzer1:
3260 if (bi[E] == 0)
3262 for (i = 1; i < NI - 1; i++)
3264 if (bi[i] != 0)
3266 ltb -= enormlz (bi);
3267 goto mnzer2;
3270 eclear (c);
3271 goto mulsign;
3273 mnzer2:
3275 /* Multiply significands */
3276 j = emulm (ai, bi);
3277 /* calculate exponent */
3278 lt = lta + ltb - (EXONE - 1);
3279 emdnorm (bi, j, 0, lt, !ROUND_TOWARDS_ZERO);
3280 emovo (bi, c);
3282 mulsign:
3284 if (sign
3285 #ifndef IEEE
3286 && (ecmp (c, ezero) != 0)
3287 #endif
3289 *(c+(NE-1)) |= 0x8000;
3290 else
3291 *(c+(NE-1)) &= ~0x8000;
3294 /* Convert double precision PE to e-type Y. */
3296 static void
3297 e53toe (pe, y)
3298 const UEMUSHORT *pe;
3299 UEMUSHORT *y;
3301 #ifdef DEC
3303 dectoe (pe, y);
3305 #else
3306 #ifdef IBM
3308 ibmtoe (pe, y, DFmode);
3310 #else
3311 #ifdef C4X
3313 c4xtoe (pe, y, HFmode);
3315 #else
3317 ieeetoe (pe, y, &ieee_53);
3319 #endif /* not C4X */
3320 #endif /* not IBM */
3321 #endif /* not DEC */
3324 /* Convert double extended precision float PE to e type Y. */
3326 static void
3327 e64toe (pe, y)
3328 const UEMUSHORT *pe;
3329 UEMUSHORT *y;
3331 UEMUSHORT yy[NI];
3332 const UEMUSHORT *e;
3333 UEMUSHORT *p, *q;
3334 int i;
3336 e = pe;
3337 p = yy;
3338 for (i = 0; i < NE - 5; i++)
3339 *p++ = 0;
3340 #ifndef C4X
3341 /* REAL_WORDS_BIG_ENDIAN is always 0 for DEC and 1 for IBM.
3342 This precision is not ordinarily supported on DEC or IBM. */
3343 if (! REAL_WORDS_BIG_ENDIAN)
3345 for (i = 0; i < 5; i++)
3346 *p++ = *e++;
3348 #ifdef IEEE
3349 /* For denormal long double Intel format, shift significand up one
3350 -- but only if the top significand bit is zero. A top bit of 1
3351 is "pseudodenormal" when the exponent is zero. */
3352 if ((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2] & 0x8000) == 0)
3354 UEMUSHORT temp[NI];
3356 emovi (yy, temp);
3357 eshup1 (temp);
3358 emovo (temp,y);
3359 return;
3361 #endif /* IEEE */
3363 else
3365 p = &yy[0] + (NE - 1);
3366 *p-- = *e++;
3367 ++e;
3368 for (i = 0; i < 4; i++)
3369 *p-- = *e++;
3371 #endif /* not C4X */
3372 #ifdef INFINITY
3373 /* Point to the exponent field and check max exponent cases. */
3374 p = &yy[NE - 1];
3375 if ((*p & 0x7fff) == 0x7fff)
3377 #ifdef NANS
3378 if (! REAL_WORDS_BIG_ENDIAN)
3380 for (i = 0; i < 4; i++)
3382 if ((i != 3 && pe[i] != 0)
3383 /* Anything but 0x8000 here, including 0, is a NaN. */
3384 || (i == 3 && pe[i] != 0x8000))
3386 enan (y, (*p & 0x8000) != 0);
3387 return;
3391 else
3393 /* In Motorola extended precision format, the most significant
3394 bit of an infinity mantissa could be either 1 or 0. It is
3395 the lower order bits that tell whether the value is a NaN. */
3396 if ((pe[2] & 0x7fff) != 0)
3397 goto bigend_nan;
3399 for (i = 3; i <= 5; i++)
3401 if (pe[i] != 0)
3403 bigend_nan:
3404 enan (y, (*p & 0x8000) != 0);
3405 return;
3409 #endif /* NANS */
3410 eclear (y);
3411 einfin (y);
3412 if (*p & 0x8000)
3413 eneg (y);
3414 return;
3416 #endif /* INFINITY */
3417 p = yy;
3418 q = y;
3419 for (i = 0; i < NE; i++)
3420 *q++ = *p++;
3423 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
3424 /* Convert 128-bit long double precision float PE to e type Y. */
3426 static void
3427 e113toe (pe, y)
3428 const UEMUSHORT *pe;
3429 UEMUSHORT *y;
3431 ieeetoe (pe, y, &ieee_113);
3433 #endif /* INTEL_EXTENDED_IEEE_FORMAT == 0 */
3435 /* Convert single precision float PE to e type Y. */
3437 static void
3438 e24toe (pe, y)
3439 const UEMUSHORT *pe;
3440 UEMUSHORT *y;
3442 #ifdef IBM
3444 ibmtoe (pe, y, SFmode);
3446 #else
3448 #ifdef C4X
3450 c4xtoe (pe, y, QFmode);
3452 #else
3453 #ifdef DEC
3455 ieeetoe (pe, y, &dec_f);
3457 #else
3459 ieeetoe (pe, y, &ieee_24);
3461 #endif /* not DEC */
3462 #endif /* not C4X */
3463 #endif /* not IBM */
3466 /* Convert machine format float of specified format PE to e type Y. */
3468 static void
3469 ieeetoe (pe, y, fmt)
3470 const UEMUSHORT *pe;
3471 UEMUSHORT *y;
3472 const struct ieee_format *fmt;
3474 UEMUSHORT r;
3475 const UEMUSHORT *e;
3476 UEMUSHORT *p;
3477 UEMUSHORT yy[NI];
3478 int denorm, i, k;
3479 int shortsm1 = fmt->bits / 16 - 1;
3480 #ifdef INFINITY
3481 int expmask = (1 << fmt->expbits) - 1;
3482 #endif
3483 int expshift = (fmt->precision - 1) & 0x0f;
3484 int highbit = 1 << expshift;
3486 e = pe;
3487 denorm = 0;
3488 ecleaz (yy);
3489 if (! REAL_WORDS_BIG_ENDIAN)
3490 e += shortsm1;
3491 r = *e;
3492 yy[0] = 0;
3493 if (r & 0x8000)
3494 yy[0] = 0xffff;
3495 yy[M] = (r & (highbit - 1)) | highbit;
3496 r = (r & 0x7fff) >> expshift;
3497 #ifdef INFINITY
3498 if (!LARGEST_EXPONENT_IS_NORMAL (fmt->precision) && r == expmask)
3500 #ifdef NANS
3501 /* First check the word where high order mantissa and exponent live */
3502 if ((*e & (highbit - 1)) != 0)
3504 enan (y, yy[0] != 0);
3505 return;
3507 if (! REAL_WORDS_BIG_ENDIAN)
3509 for (i = 0; i < shortsm1; i++)
3511 if (pe[i] != 0)
3513 enan (y, yy[0] != 0);
3514 return;
3518 else
3520 for (i = 1; i < shortsm1 + 1; i++)
3522 if (pe[i] != 0)
3524 enan (y, yy[0] != 0);
3525 return;
3529 #endif /* NANS */
3530 eclear (y);
3531 einfin (y);
3532 if (yy[0])
3533 eneg (y);
3534 return;
3536 #endif /* INFINITY */
3537 /* If zero exponent, then the significand is denormalized.
3538 So take back the understood high significand bit. */
3539 if (r == 0)
3541 denorm = 1;
3542 yy[M] &= ~highbit;
3544 r += fmt->adjustment;
3545 yy[E] = r;
3546 p = &yy[M + 1];
3547 if (! REAL_WORDS_BIG_ENDIAN)
3549 for (i = 0; i < shortsm1; i++)
3550 *p++ = *(--e);
3552 else
3554 ++e;
3555 for (i = 0; i < shortsm1; i++)
3556 *p++ = *e++;
3558 if (fmt->precision == 113)
3560 /* denorm is left alone in 113 bit format */
3561 if (!denorm)
3562 eshift (yy, -1);
3564 else
3566 eshift (yy, -(expshift + 1));
3567 if (denorm)
3568 { /* if zero exponent, then normalize the significand */
3569 if ((k = enormlz (yy)) > NBITS)
3570 ecleazs (yy);
3571 else
3572 yy[E] -= (UEMUSHORT) (k - 1);
3575 emovo (yy, y);
3578 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
3579 /* Convert e-type X to IEEE 128-bit long double format E. */
3581 static void
3582 etoe113 (x, e)
3583 const UEMUSHORT *x;
3584 UEMUSHORT *e;
3586 etoieee (x, e, &ieee_113);
3589 /* Convert exploded e-type X, that has already been rounded to
3590 113-bit precision, to IEEE 128-bit long double format Y. */
3592 static void
3593 toe113 (x, y)
3594 UEMUSHORT *x, *y;
3596 toieee (x, y, &ieee_113);
3599 #endif /* INTEL_EXTENDED_IEEE_FORMAT == 0 */
3601 /* Convert e-type X to IEEE double extended format E. */
3603 static void
3604 etoe64 (x, e)
3605 const UEMUSHORT *x;
3606 UEMUSHORT *e;
3608 etoieee (x, e, &ieee_64);
3611 /* Convert exploded e-type X, that has already been rounded to
3612 64-bit precision, to IEEE double extended format Y. */
3614 static void
3615 toe64 (x, y)
3616 UEMUSHORT *x, *y;
3618 toieee (x, y, &ieee_64);
3621 /* e type to double precision. */
3623 #ifdef DEC
3624 /* Convert e-type X to DEC-format double E. */
3626 static void
3627 etoe53 (x, e)
3628 const UEMUSHORT *x;
3629 UEMUSHORT *e;
3631 etodec (x, e);
3634 /* Convert exploded e-type X, that has already been rounded to
3635 56-bit double precision, to DEC double Y. */
3637 static void
3638 toe53 (x, y)
3639 UEMUSHORT *x, *y;
3641 todec (x, y);
3644 #else
3645 #ifdef IBM
3646 /* Convert e-type X to IBM 370-format double E. */
3648 static void
3649 etoe53 (x, e)
3650 const UEMUSHORT *x;
3651 UEMUSHORT *e;
3653 etoibm (x, e, DFmode);
3656 /* Convert exploded e-type X, that has already been rounded to
3657 56-bit precision, to IBM 370 double Y. */
3659 static void
3660 toe53 (x, y)
3661 UEMUSHORT *x, *y;
3663 toibm (x, y, DFmode);
3666 #else /* it's neither DEC nor IBM */
3667 #ifdef C4X
3668 /* Convert e-type X to C4X-format long double E. */
3670 static void
3671 etoe53 (x, e)
3672 const UEMUSHORT *x;
3673 UEMUSHORT *e;
3675 etoc4x (x, e, HFmode);
3678 /* Convert exploded e-type X, that has already been rounded to
3679 56-bit precision, to IBM 370 double Y. */
3681 static void
3682 toe53 (x, y)
3683 UEMUSHORT *x, *y;
3685 toc4x (x, y, HFmode);
3688 #else /* it's neither DEC nor IBM nor C4X */
3690 /* Convert e-type X to IEEE double E. */
3692 static void
3693 etoe53 (x, e)
3694 const UEMUSHORT *x;
3695 UEMUSHORT *e;
3697 etoieee (x, e, &ieee_53);
3700 /* Convert exploded e-type X, that has already been rounded to
3701 53-bit precision, to IEEE double Y. */
3703 static void
3704 toe53 (x, y)
3705 UEMUSHORT *x, *y;
3707 toieee (x, y, &ieee_53);
3710 #endif /* not C4X */
3711 #endif /* not IBM */
3712 #endif /* not DEC */
3716 /* e type to single precision. */
3718 #ifdef IBM
3719 /* Convert e-type X to IBM 370 float E. */
3721 static void
3722 etoe24 (x, e)
3723 const UEMUSHORT *x;
3724 UEMUSHORT *e;
3726 etoibm (x, e, SFmode);
3729 /* Convert exploded e-type X, that has already been rounded to
3730 float precision, to IBM 370 float Y. */
3732 static void
3733 toe24 (x, y)
3734 UEMUSHORT *x, *y;
3736 toibm (x, y, SFmode);
3739 #else /* it's not IBM */
3741 #ifdef C4X
3742 /* Convert e-type X to C4X float E. */
3744 static void
3745 etoe24 (x, e)
3746 const UEMUSHORT *x;
3747 UEMUSHORT *e;
3749 etoc4x (x, e, QFmode);
3752 /* Convert exploded e-type X, that has already been rounded to
3753 float precision, to IBM 370 float Y. */
3755 static void
3756 toe24 (x, y)
3757 UEMUSHORT *x, *y;
3759 toc4x (x, y, QFmode);
3762 #else /* it's neither IBM nor C4X */
3764 #ifdef DEC
3766 /* Convert e-type X to DEC F-float E. */
3768 static void
3769 etoe24 (x, e)
3770 const UEMUSHORT *x;
3771 UEMUSHORT *e;
3773 etoieee (x, e, &dec_f);
3776 /* Convert exploded e-type X, that has already been rounded to
3777 float precision, to DEC F-float Y. */
3779 static void
3780 toe24 (x, y)
3781 UEMUSHORT *x, *y;
3783 toieee (x, y, &dec_f);
3786 #else
3788 /* Convert e-type X to IEEE float E. */
3790 static void
3791 etoe24 (x, e)
3792 const UEMUSHORT *x;
3793 UEMUSHORT *e;
3795 etoieee (x, e, &ieee_24);
3798 /* Convert exploded e-type X, that has already been rounded to
3799 float precision, to IEEE float Y. */
3801 static void
3802 toe24 (x, y)
3803 UEMUSHORT *x, *y;
3805 toieee (x, y, &ieee_24);
3808 #endif /* not DEC */
3809 #endif /* not C4X */
3810 #endif /* not IBM */
3813 /* Convert e-type X to the IEEE format described by FMT. */
3815 static void
3816 etoieee (x, e, fmt)
3817 const UEMUSHORT *x;
3818 UEMUSHORT *e;
3819 const struct ieee_format *fmt;
3821 UEMUSHORT xi[NI];
3822 EMULONG exp;
3823 int rndsav;
3825 #ifdef NANS
3826 if (eisnan (x))
3828 make_nan (e, eisneg (x), fmt->mode);
3829 return;
3831 #endif
3833 emovi (x, xi);
3835 #ifdef INFINITY
3836 if (eisinf (x))
3837 goto nonorm;
3838 #endif
3839 /* Adjust exponent for offset. */
3840 exp = (EMULONG) xi[E] - fmt->adjustment;
3842 /* Round off to nearest or even. */
3843 rndsav = rndprc;
3844 rndprc = fmt->precision;
3845 emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
3846 rndprc = rndsav;
3847 #ifdef INFINITY
3848 nonorm:
3849 #endif
3850 toieee (xi, e, fmt);
3853 /* Convert exploded e-type X, that has already been rounded to
3854 the necessary precision, to the IEEE format described by FMT. */
3856 static void
3857 toieee (x, y, fmt)
3858 UEMUSHORT *x, *y;
3859 const struct ieee_format *fmt;
3861 UEMUSHORT maxexp;
3862 UEMUSHORT *q;
3863 int words;
3864 int i;
3866 maxexp = (1 << fmt->expbits) - 1;
3867 words = (fmt->bits - fmt->expbits) / EMUSHORT_SIZE;
3869 #ifdef NANS
3870 if (eiisnan (x))
3872 make_nan (y, eiisneg (x), fmt->mode);
3873 return;
3875 #endif
3877 if (fmt->expbits < 15
3878 && LARGEST_EXPONENT_IS_NORMAL (fmt->bits)
3879 && x[E] > maxexp)
3881 saturate (y, eiisneg (x), fmt->bits, 1);
3882 return;
3885 /* Point to the exponent. */
3886 if (REAL_WORDS_BIG_ENDIAN)
3887 q = y;
3888 else
3889 q = y + words;
3891 /* Copy the sign. */
3892 if (x[0])
3893 *q = 0x8000;
3894 else
3895 *q = 0;
3897 if (fmt->expbits < 15
3898 && !LARGEST_EXPONENT_IS_NORMAL (fmt->bits)
3899 && x[E] >= maxexp)
3901 /* Saturate at largest number less that infinity. */
3902 UEMUSHORT fill;
3903 #ifdef INFINITY
3904 *q |= maxexp << (15 - fmt->expbits);
3905 fill = 0;
3906 #else
3907 *q |= (maxexp << (15 - fmt->expbits)) - 1;
3908 fill = 0xffff;
3909 #endif
3911 if (!REAL_WORDS_BIG_ENDIAN)
3913 for (i = 0; i < words; i++)
3914 *(--q) = fill;
3916 else
3918 for (i = 0; i < words; i++)
3919 *(++q) = fill;
3921 #if defined(INFINITY) && defined(ERANGE)
3922 errno = ERANGE;
3923 #endif
3924 return;
3927 /* If denormal and DEC float, return zero (DEC has no denormals) */
3928 #ifdef DEC
3929 if (x[E] == 0)
3931 for (i = 0; i < fmt->bits / EMUSHORT_SIZE ; i++)
3932 q[i] = 0;
3933 return;
3935 #endif /* DEC */
3937 /* Delete the implied bit unless denormal, except for
3938 64-bit precision. */
3939 if (fmt->precision != 64 && x[E] != 0)
3941 eshup1 (x);
3944 /* Shift denormal double extended Intel format significand down
3945 one bit. */
3946 if (fmt->precision == 64 && x[E] == 0 && ! REAL_WORDS_BIG_ENDIAN)
3947 eshdn1 (x);
3949 if (fmt->expbits < 15)
3951 /* Shift the significand. */
3952 eshift (x, 15 - fmt->expbits);
3954 /* Combine the exponent and upper bits of the significand. */
3955 *q |= x[E] << (15 - fmt->expbits);
3956 *q |= x[M] & (UEMUSHORT) ~((maxexp << (15 - fmt->expbits)) | 0x8000);
3958 else
3960 /* Copy the exponent. */
3961 *q |= x[E];
3964 /* Add padding after the exponent. At the moment, this is only necessary for
3965 64-bit precision; in this case, the padding is 16 bits. */
3966 if (fmt->precision == 64)
3968 *(q + 1) = 0;
3970 /* Skip padding. */
3971 if (REAL_WORDS_BIG_ENDIAN)
3972 ++q;
3975 /* Copy the significand. */
3976 if (REAL_WORDS_BIG_ENDIAN)
3978 for (i = 0; i < words; i++)
3979 *(++q) = x[i + M + 1];
3981 #ifdef INFINITY
3982 else if (fmt->precision == 64 && eiisinf (x))
3984 /* Intel double extended infinity significand. */
3985 *(--q) = 0x8000;
3986 *(--q) = 0;
3987 *(--q) = 0;
3988 *(--q) = 0;
3990 #endif
3991 else
3993 for (i = 0; i < words; i++)
3994 *(--q) = x[i + M + 1];
3999 /* Compare two e type numbers.
4000 Return +1 if a > b
4001 0 if a == b
4002 -1 if a < b
4003 -2 if either a or b is a NaN. */
4005 static int
4006 ecmp (a, b)
4007 const UEMUSHORT *a, *b;
4009 UEMUSHORT ai[NI], bi[NI];
4010 UEMUSHORT *p, *q;
4011 int i;
4012 int msign;
4014 #ifdef NANS
4015 if (eisnan (a) || eisnan (b))
4016 return (-2);
4017 #endif
4018 emovi (a, ai);
4019 p = ai;
4020 emovi (b, bi);
4021 q = bi;
4023 if (*p != *q)
4024 { /* the signs are different */
4025 /* -0 equals + 0 */
4026 for (i = 1; i < NI - 1; i++)
4028 if (ai[i] != 0)
4029 goto nzro;
4030 if (bi[i] != 0)
4031 goto nzro;
4033 return (0);
4034 nzro:
4035 if (*p == 0)
4036 return (1);
4037 else
4038 return (-1);
4040 /* both are the same sign */
4041 if (*p == 0)
4042 msign = 1;
4043 else
4044 msign = -1;
4045 i = NI - 1;
4048 if (*p++ != *q++)
4050 goto diff;
4053 while (--i > 0);
4055 return (0); /* equality */
4057 diff:
4059 if (*(--p) > *(--q))
4060 return (msign); /* p is bigger */
4061 else
4062 return (-msign); /* p is littler */
4065 #if 0
4066 /* Find e-type nearest integer to X, as floor (X + 0.5). */
4068 static void
4069 eround (x, y)
4070 const UEMUSHORT *x;
4071 UEMUSHORT *y;
4073 eadd (ehalf, x, y);
4074 efloor (y, y);
4076 #endif /* 0 */
4078 /* Convert HOST_WIDE_INT LP to e type Y. */
4080 static void
4081 ltoe (lp, y)
4082 const HOST_WIDE_INT *lp;
4083 UEMUSHORT *y;
4085 UEMUSHORT yi[NI];
4086 unsigned HOST_WIDE_INT ll;
4087 int k;
4089 ecleaz (yi);
4090 if (*lp < 0)
4092 /* make it positive */
4093 ll = (unsigned HOST_WIDE_INT) (-(*lp));
4094 yi[0] = 0xffff; /* put correct sign in the e type number */
4096 else
4098 ll = (unsigned HOST_WIDE_INT) (*lp);
4100 /* move the long integer to yi significand area */
4101 #if HOST_BITS_PER_WIDE_INT == 64
4102 yi[M] = (UEMUSHORT) (ll >> 48);
4103 yi[M + 1] = (UEMUSHORT) (ll >> 32);
4104 yi[M + 2] = (UEMUSHORT) (ll >> 16);
4105 yi[M + 3] = (UEMUSHORT) ll;
4106 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
4107 #else
4108 yi[M] = (UEMUSHORT) (ll >> 16);
4109 yi[M + 1] = (UEMUSHORT) ll;
4110 yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
4111 #endif
4113 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
4114 ecleaz (yi); /* it was zero */
4115 else
4116 yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
4117 emovo (yi, y); /* output the answer */
4120 /* Convert unsigned HOST_WIDE_INT LP to e type Y. */
4122 static void
4123 ultoe (lp, y)
4124 const unsigned HOST_WIDE_INT *lp;
4125 UEMUSHORT *y;
4127 UEMUSHORT yi[NI];
4128 unsigned HOST_WIDE_INT ll;
4129 int k;
4131 ecleaz (yi);
4132 ll = *lp;
4134 /* move the long integer to ayi significand area */
4135 #if HOST_BITS_PER_WIDE_INT == 64
4136 yi[M] = (UEMUSHORT) (ll >> 48);
4137 yi[M + 1] = (UEMUSHORT) (ll >> 32);
4138 yi[M + 2] = (UEMUSHORT) (ll >> 16);
4139 yi[M + 3] = (UEMUSHORT) ll;
4140 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
4141 #else
4142 yi[M] = (UEMUSHORT) (ll >> 16);
4143 yi[M + 1] = (UEMUSHORT) ll;
4144 yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
4145 #endif
4147 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
4148 ecleaz (yi); /* it was zero */
4149 else
4150 yi[E] -= (UEMUSHORT) k; /* subtract shift count from exponent */
4151 emovo (yi, y); /* output the answer */
4155 /* Find signed HOST_WIDE_INT integer I and floating point fractional
4156 part FRAC of e-type (packed internal format) floating point input X.
4157 The integer output I has the sign of the input, except that
4158 positive overflow is permitted if FIXUNS_TRUNC_LIKE_FIX_TRUNC.
4159 The output e-type fraction FRAC is the positive fractional
4160 part of abs (X). */
4162 static void
4163 eifrac (x, i, frac)
4164 const UEMUSHORT *x;
4165 HOST_WIDE_INT *i;
4166 UEMUSHORT *frac;
4168 UEMUSHORT xi[NI];
4169 int j, k;
4170 unsigned HOST_WIDE_INT ll;
4172 emovi (x, xi);
4173 k = (int) xi[E] - (EXONE - 1);
4174 if (k <= 0)
4176 /* if exponent <= 0, integer = 0 and real output is fraction */
4177 *i = 0L;
4178 emovo (xi, frac);
4179 return;
4181 if (k > (HOST_BITS_PER_WIDE_INT - 1))
4183 /* long integer overflow: output large integer
4184 and correct fraction */
4185 if (xi[0])
4186 *i = ((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1);
4187 else
4189 #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC
4190 /* In this case, let it overflow and convert as if unsigned. */
4191 euifrac (x, &ll, frac);
4192 *i = (HOST_WIDE_INT) ll;
4193 return;
4194 #else
4195 /* In other cases, return the largest positive integer. */
4196 *i = (((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1)) - 1;
4197 #endif
4199 eshift (xi, k);
4200 if (extra_warnings)
4201 warning ("overflow on truncation to integer");
4203 else if (k > 16)
4205 /* Shift more than 16 bits: first shift up k-16 mod 16,
4206 then shift up by 16's. */
4207 j = k - ((k >> 4) << 4);
4208 eshift (xi, j);
4209 ll = xi[M];
4210 k -= j;
4213 eshup6 (xi);
4214 ll = (ll << 16) | xi[M];
4216 while ((k -= 16) > 0);
4217 *i = ll;
4218 if (xi[0])
4219 *i = -(*i);
4221 else
4223 /* shift not more than 16 bits */
4224 eshift (xi, k);
4225 *i = (HOST_WIDE_INT) xi[M] & 0xffff;
4226 if (xi[0])
4227 *i = -(*i);
4229 xi[0] = 0;
4230 xi[E] = EXONE - 1;
4231 xi[M] = 0;
4232 if ((k = enormlz (xi)) > NBITS)
4233 ecleaz (xi);
4234 else
4235 xi[E] -= (UEMUSHORT) k;
4237 emovo (xi, frac);
4241 /* Find unsigned HOST_WIDE_INT integer I and floating point fractional part
4242 FRAC of e-type X. A negative input yields integer output = 0 but
4243 correct fraction. */
4245 static void
4246 euifrac (x, i, frac)
4247 const UEMUSHORT *x;
4248 unsigned HOST_WIDE_INT *i;
4249 UEMUSHORT *frac;
4251 unsigned HOST_WIDE_INT ll;
4252 UEMUSHORT xi[NI];
4253 int j, k;
4255 emovi (x, xi);
4256 k = (int) xi[E] - (EXONE - 1);
4257 if (k <= 0)
4259 /* if exponent <= 0, integer = 0 and argument is fraction */
4260 *i = 0L;
4261 emovo (xi, frac);
4262 return;
4264 if (k > HOST_BITS_PER_WIDE_INT)
4266 /* Long integer overflow: output large integer
4267 and correct fraction.
4268 Note, the BSD MicroVAX compiler says that ~(0UL)
4269 is a syntax error. */
4270 *i = ~(0L);
4271 eshift (xi, k);
4272 if (extra_warnings)
4273 warning ("overflow on truncation to unsigned integer");
4275 else if (k > 16)
4277 /* Shift more than 16 bits: first shift up k-16 mod 16,
4278 then shift up by 16's. */
4279 j = k - ((k >> 4) << 4);
4280 eshift (xi, j);
4281 ll = xi[M];
4282 k -= j;
4285 eshup6 (xi);
4286 ll = (ll << 16) | xi[M];
4288 while ((k -= 16) > 0);
4289 *i = ll;
4291 else
4293 /* shift not more than 16 bits */
4294 eshift (xi, k);
4295 *i = (HOST_WIDE_INT) xi[M] & 0xffff;
4298 if (xi[0]) /* A negative value yields unsigned integer 0. */
4299 *i = 0L;
4301 xi[0] = 0;
4302 xi[E] = EXONE - 1;
4303 xi[M] = 0;
4304 if ((k = enormlz (xi)) > NBITS)
4305 ecleaz (xi);
4306 else
4307 xi[E] -= (UEMUSHORT) k;
4309 emovo (xi, frac);
4312 /* Shift the significand of exploded e-type X up or down by SC bits. */
4314 static int
4315 eshift (x, sc)
4316 UEMUSHORT *x;
4317 int sc;
4319 UEMUSHORT lost;
4320 UEMUSHORT *p;
4322 if (sc == 0)
4323 return (0);
4325 lost = 0;
4326 p = x + NI - 1;
4328 if (sc < 0)
4330 sc = -sc;
4331 while (sc >= 16)
4333 lost |= *p; /* remember lost bits */
4334 eshdn6 (x);
4335 sc -= 16;
4338 while (sc >= 8)
4340 lost |= *p & 0xff;
4341 eshdn8 (x);
4342 sc -= 8;
4345 while (sc > 0)
4347 lost |= *p & 1;
4348 eshdn1 (x);
4349 sc -= 1;
4352 else
4354 while (sc >= 16)
4356 eshup6 (x);
4357 sc -= 16;
4360 while (sc >= 8)
4362 eshup8 (x);
4363 sc -= 8;
4366 while (sc > 0)
4368 eshup1 (x);
4369 sc -= 1;
4372 if (lost)
4373 lost = 1;
4374 return ((int) lost);
4377 /* Shift normalize the significand area of exploded e-type X.
4378 Return the shift count (up = positive). */
4380 static int
4381 enormlz (x)
4382 UEMUSHORT x[];
4384 UEMUSHORT *p;
4385 int sc;
4387 sc = 0;
4388 p = &x[M];
4389 if (*p != 0)
4390 goto normdn;
4391 ++p;
4392 if (*p & 0x8000)
4393 return (0); /* already normalized */
4394 while (*p == 0)
4396 eshup6 (x);
4397 sc += 16;
4399 /* With guard word, there are NBITS+16 bits available.
4400 Return true if all are zero. */
4401 if (sc > NBITS)
4402 return (sc);
4404 /* see if high byte is zero */
4405 while ((*p & 0xff00) == 0)
4407 eshup8 (x);
4408 sc += 8;
4410 /* now shift 1 bit at a time */
4411 while ((*p & 0x8000) == 0)
4413 eshup1 (x);
4414 sc += 1;
4415 if (sc > NBITS)
4417 mtherr ("enormlz", UNDERFLOW);
4418 return (sc);
4421 return (sc);
4423 /* Normalize by shifting down out of the high guard word
4424 of the significand */
4425 normdn:
4427 if (*p & 0xff00)
4429 eshdn8 (x);
4430 sc -= 8;
4432 while (*p != 0)
4434 eshdn1 (x);
4435 sc -= 1;
4437 if (sc < -NBITS)
4439 mtherr ("enormlz", OVERFLOW);
4440 return (sc);
4443 return (sc);
4446 /* Powers of ten used in decimal <-> binary conversions. */
4448 #define NTEN 12
4449 #define MAXP 4096
4451 #if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && (INTEL_EXTENDED_IEEE_FORMAT == 0)
4452 static const UEMUSHORT etens[NTEN + 1][NE] =
4454 {0x6576, 0x4a92, 0x804a, 0x153f,
4455 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
4456 {0x6a32, 0xce52, 0x329a, 0x28ce,
4457 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
4458 {0x526c, 0x50ce, 0xf18b, 0x3d28,
4459 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
4460 {0x9c66, 0x58f8, 0xbc50, 0x5c54,
4461 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
4462 {0x851e, 0xeab7, 0x98fe, 0x901b,
4463 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
4464 {0x0235, 0x0137, 0x36b1, 0x336c,
4465 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
4466 {0x50f8, 0x25fb, 0xc76b, 0x6b71,
4467 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
4468 {0x0000, 0x0000, 0x0000, 0x0000,
4469 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
4470 {0x0000, 0x0000, 0x0000, 0x0000,
4471 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
4472 {0x0000, 0x0000, 0x0000, 0x0000,
4473 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
4474 {0x0000, 0x0000, 0x0000, 0x0000,
4475 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
4476 {0x0000, 0x0000, 0x0000, 0x0000,
4477 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
4478 {0x0000, 0x0000, 0x0000, 0x0000,
4479 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
4482 static const UEMUSHORT emtens[NTEN + 1][NE] =
4484 {0x2030, 0xcffc, 0xa1c3, 0x8123,
4485 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
4486 {0x8264, 0xd2cb, 0xf2ea, 0x12d4,
4487 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
4488 {0xf53f, 0xf698, 0x6bd3, 0x0158,
4489 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
4490 {0xe731, 0x04d4, 0xe3f2, 0xd332,
4491 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
4492 {0xa23e, 0x5308, 0xfefb, 0x1155,
4493 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
4494 {0xe26d, 0xdbde, 0xd05d, 0xb3f6,
4495 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
4496 {0x2a20, 0x6224, 0x47b3, 0x98d7,
4497 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
4498 {0x0b5b, 0x4af2, 0xa581, 0x18ed,
4499 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
4500 {0xbf71, 0xa9b3, 0x7989, 0xbe68,
4501 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
4502 {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b,
4503 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
4504 {0xc155, 0xa4a8, 0x404e, 0x6113,
4505 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
4506 {0xd70a, 0x70a3, 0x0a3d, 0xa3d7,
4507 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
4508 {0xcccd, 0xcccc, 0xcccc, 0xcccc,
4509 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
4511 #else
4512 /* LONG_DOUBLE_TYPE_SIZE is other than 128 */
4513 static const UEMUSHORT etens[NTEN + 1][NE] =
4515 {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
4516 {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
4517 {0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
4518 {0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
4519 {0xddbc, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
4520 {0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
4521 {0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
4522 {0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
4523 {0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
4524 {0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
4525 {0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
4526 {0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
4527 {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
4530 static const UEMUSHORT emtens[NTEN + 1][NE] =
4532 {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
4533 {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
4534 {0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
4535 {0x7133, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
4536 {0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
4537 {0xac7d, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
4538 {0x3f24, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
4539 {0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
4540 {0x4c2f, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
4541 {0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
4542 {0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
4543 {0x3d71, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
4544 {0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
4546 #endif
4548 #if 0
4549 /* Convert float value X to ASCII string STRING with NDIG digits after
4550 the decimal point. */
4552 static void
4553 e24toasc (x, string, ndigs)
4554 const UEMUSHORT x[];
4555 char *string;
4556 int ndigs;
4558 UEMUSHORT w[NI];
4560 e24toe (x, w);
4561 etoasc (w, string, ndigs);
4564 /* Convert double value X to ASCII string STRING with NDIG digits after
4565 the decimal point. */
4567 static void
4568 e53toasc (x, string, ndigs)
4569 const UEMUSHORT x[];
4570 char *string;
4571 int ndigs;
4573 UEMUSHORT w[NI];
4575 e53toe (x, w);
4576 etoasc (w, string, ndigs);
4579 /* Convert double extended value X to ASCII string STRING with NDIG digits
4580 after the decimal point. */
4582 static void
4583 e64toasc (x, string, ndigs)
4584 const UEMUSHORT x[];
4585 char *string;
4586 int ndigs;
4588 UEMUSHORT w[NI];
4590 e64toe (x, w);
4591 etoasc (w, string, ndigs);
4594 /* Convert 128-bit long double value X to ASCII string STRING with NDIG digits
4595 after the decimal point. */
4597 static void
4598 e113toasc (x, string, ndigs)
4599 const UEMUSHORT x[];
4600 char *string;
4601 int ndigs;
4603 UEMUSHORT w[NI];
4605 e113toe (x, w);
4606 etoasc (w, string, ndigs);
4608 #endif /* 0 */
4610 /* Convert e-type X to ASCII string STRING with NDIGS digits after
4611 the decimal point. */
4613 static char wstring[80]; /* working storage for ASCII output */
4615 static void
4616 etoasc (x, string, ndigs)
4617 const UEMUSHORT x[];
4618 char *string;
4619 int ndigs;
4621 EMUSHORT digit;
4622 UEMUSHORT y[NI], t[NI], u[NI], w[NI];
4623 const UEMUSHORT *p, *r, *ten;
4624 UEMUSHORT sign;
4625 int i, j, k, expon, rndsav;
4626 char *s, *ss;
4627 UEMUSHORT m;
4630 rndsav = rndprc;
4631 ss = string;
4632 s = wstring;
4633 *ss = '\0';
4634 *s = '\0';
4635 #ifdef NANS
4636 if (eisnan (x))
4638 sprintf (wstring, " NaN ");
4639 goto bxit;
4641 #endif
4642 rndprc = NBITS; /* set to full precision */
4643 emov (x, y); /* retain external format */
4644 if (y[NE - 1] & 0x8000)
4646 sign = 0xffff;
4647 y[NE - 1] &= 0x7fff;
4649 else
4651 sign = 0;
4653 expon = 0;
4654 ten = &etens[NTEN][0];
4655 emov (eone, t);
4656 /* Test for zero exponent */
4657 if (y[NE - 1] == 0)
4659 for (k = 0; k < NE - 1; k++)
4661 if (y[k] != 0)
4662 goto tnzro; /* denormalized number */
4664 goto isone; /* valid all zeros */
4666 tnzro:
4668 /* Test for infinity. */
4669 if (y[NE - 1] == 0x7fff)
4671 if (sign)
4672 sprintf (wstring, " -Infinity ");
4673 else
4674 sprintf (wstring, " Infinity ");
4675 goto bxit;
4678 /* Test for exponent nonzero but significand denormalized.
4679 * This is an error condition.
4681 if ((y[NE - 1] != 0) && ((y[NE - 2] & 0x8000) == 0))
4683 mtherr ("etoasc", DOMAIN);
4684 sprintf (wstring, "NaN");
4685 goto bxit;
4688 /* Compare to 1.0 */
4689 i = ecmp (eone, y);
4690 if (i == 0)
4691 goto isone;
4693 if (i == -2)
4694 abort ();
4696 if (i < 0)
4697 { /* Number is greater than 1 */
4698 /* Convert significand to an integer and strip trailing decimal zeros. */
4699 emov (y, u);
4700 u[NE - 1] = EXONE + NBITS - 1;
4702 p = &etens[NTEN - 4][0];
4703 m = 16;
4706 ediv (p, u, t);
4707 efloor (t, w);
4708 for (j = 0; j < NE - 1; j++)
4710 if (t[j] != w[j])
4711 goto noint;
4713 emov (t, u);
4714 expon += (int) m;
4715 noint:
4716 p += NE;
4717 m >>= 1;
4719 while (m != 0);
4721 /* Rescale from integer significand */
4722 u[NE - 1] += y[NE - 1] - (unsigned int) (EXONE + NBITS - 1);
4723 emov (u, y);
4724 /* Find power of 10 */
4725 emov (eone, t);
4726 m = MAXP;
4727 p = &etens[0][0];
4728 /* An unordered compare result shouldn't happen here. */
4729 while (ecmp (ten, u) <= 0)
4731 if (ecmp (p, u) <= 0)
4733 ediv (p, u, u);
4734 emul (p, t, t);
4735 expon += (int) m;
4737 m >>= 1;
4738 if (m == 0)
4739 break;
4740 p += NE;
4743 else
4744 { /* Number is less than 1.0 */
4745 /* Pad significand with trailing decimal zeros. */
4746 if (y[NE - 1] == 0)
4748 while ((y[NE - 2] & 0x8000) == 0)
4750 emul (ten, y, y);
4751 expon -= 1;
4754 else
4756 emovi (y, w);
4757 for (i = 0; i < NDEC + 1; i++)
4759 if ((w[NI - 1] & 0x7) != 0)
4760 break;
4761 /* multiply by 10 */
4762 emovz (w, u);
4763 eshdn1 (u);
4764 eshdn1 (u);
4765 eaddm (w, u);
4766 u[1] += 3;
4767 while (u[2] != 0)
4769 eshdn1 (u);
4770 u[1] += 1;
4772 if (u[NI - 1] != 0)
4773 break;
4774 if (eone[NE - 1] <= u[1])
4775 break;
4776 emovz (u, w);
4777 expon -= 1;
4779 emovo (w, y);
4781 k = -MAXP;
4782 p = &emtens[0][0];
4783 r = &etens[0][0];
4784 emov (y, w);
4785 emov (eone, t);
4786 while (ecmp (eone, w) > 0)
4788 if (ecmp (p, w) >= 0)
4790 emul (r, w, w);
4791 emul (r, t, t);
4792 expon += k;
4794 k /= 2;
4795 if (k == 0)
4796 break;
4797 p += NE;
4798 r += NE;
4800 ediv (t, eone, t);
4802 isone:
4803 /* Find the first (leading) digit. */
4804 emovi (t, w);
4805 emovz (w, t);
4806 emovi (y, w);
4807 emovz (w, y);
4808 eiremain (t, y);
4809 digit = equot[NI - 1];
4810 while ((digit == 0) && (ecmp (y, ezero) != 0))
4812 eshup1 (y);
4813 emovz (y, u);
4814 eshup1 (u);
4815 eshup1 (u);
4816 eaddm (u, y);
4817 eiremain (t, y);
4818 digit = equot[NI - 1];
4819 expon -= 1;
4821 s = wstring;
4822 if (sign)
4823 *s++ = '-';
4824 else
4825 *s++ = ' ';
4826 /* Examine number of digits requested by caller. */
4827 if (ndigs < 0)
4828 ndigs = 0;
4829 if (ndigs > NDEC)
4830 ndigs = NDEC;
4831 if (digit == 10)
4833 *s++ = '1';
4834 *s++ = '.';
4835 if (ndigs > 0)
4837 *s++ = '0';
4838 ndigs -= 1;
4840 expon += 1;
4842 else
4844 *s++ = (char) digit + '0';
4845 *s++ = '.';
4847 /* Generate digits after the decimal point. */
4848 for (k = 0; k <= ndigs; k++)
4850 /* multiply current number by 10, without normalizing */
4851 eshup1 (y);
4852 emovz (y, u);
4853 eshup1 (u);
4854 eshup1 (u);
4855 eaddm (u, y);
4856 eiremain (t, y);
4857 *s++ = (char) equot[NI - 1] + '0';
4859 digit = equot[NI - 1];
4860 --s;
4861 ss = s;
4862 /* round off the ASCII string */
4863 if (digit > 4)
4865 /* Test for critical rounding case in ASCII output. */
4866 if (digit == 5)
4868 emovo (y, t);
4869 if (ecmp (t, ezero) != 0)
4870 goto roun; /* round to nearest */
4871 #ifndef C4X
4872 if ((*(s - 1) & 1) == 0)
4873 goto doexp; /* round to even */
4874 #endif
4876 /* Round up and propagate carry-outs */
4877 roun:
4878 --s;
4879 k = *s & CHARMASK;
4880 /* Carry out to most significant digit? */
4881 if (k == '.')
4883 --s;
4884 k = *s;
4885 k += 1;
4886 *s = (char) k;
4887 /* Most significant digit carries to 10? */
4888 if (k > '9')
4890 expon += 1;
4891 *s = '1';
4893 goto doexp;
4895 /* Round up and carry out from less significant digits */
4896 k += 1;
4897 *s = (char) k;
4898 if (k > '9')
4900 *s = '0';
4901 goto roun;
4904 doexp:
4905 /* Strip trailing zeros, but leave at least one. */
4906 while (ss[-1] == '0' && ss[-2] != '.')
4907 --ss;
4908 sprintf (ss, "e%d", expon);
4909 bxit:
4910 rndprc = rndsav;
4911 /* copy out the working string */
4912 s = string;
4913 ss = wstring;
4914 while (*ss == ' ') /* strip possible leading space */
4915 ++ss;
4916 while ((*s++ = *ss++) != '\0')
4921 /* Convert ASCII string to floating point.
4923 Numeric input is a free format decimal number of any length, with
4924 or without decimal point. Entering E after the number followed by an
4925 integer number causes the second number to be interpreted as a power of
4926 10 to be multiplied by the first number (i.e., "scientific" notation). */
4928 /* Convert ASCII string S to single precision float value Y. */
4930 static void
4931 asctoe24 (s, y)
4932 const char *s;
4933 UEMUSHORT *y;
4935 asctoeg (s, y, 24);
4939 /* Convert ASCII string S to double precision value Y. */
4941 static void
4942 asctoe53 (s, y)
4943 const char *s;
4944 UEMUSHORT *y;
4946 #if defined(DEC) || defined(IBM)
4947 asctoeg (s, y, 56);
4948 #else
4949 #if defined(C4X)
4950 asctoeg (s, y, 32);
4951 #else
4952 asctoeg (s, y, 53);
4953 #endif
4954 #endif
4958 /* Convert ASCII string S to double extended value Y. */
4960 static void
4961 asctoe64 (s, y)
4962 const char *s;
4963 UEMUSHORT *y;
4965 asctoeg (s, y, 64);
4968 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
4969 /* Convert ASCII string S to 128-bit long double Y. */
4971 static void
4972 asctoe113 (s, y)
4973 const char *s;
4974 UEMUSHORT *y;
4976 asctoeg (s, y, 113);
4978 #endif
4980 /* Convert ASCII string S to e type Y. */
4982 static void
4983 asctoe (s, y)
4984 const char *s;
4985 UEMUSHORT *y;
4987 asctoeg (s, y, NBITS);
4990 /* Convert ASCII string SS to e type Y, with a specified rounding precision
4991 of OPREC bits. BASE is 16 for C99 hexadecimal floating constants. */
4993 static void
4994 asctoeg (ss, y, oprec)
4995 const char *ss;
4996 UEMUSHORT *y;
4997 int oprec;
4999 UEMUSHORT yy[NI], xt[NI], tt[NI];
5000 int esign, decflg, sgnflg, nexp, exp, prec, lost;
5001 int i, k, trail, c, rndsav;
5002 EMULONG lexp;
5003 UEMUSHORT nsign;
5004 char *sp, *s, *lstr;
5005 int base = 10;
5007 /* Copy the input string. */
5008 lstr = (char *) alloca (strlen (ss) + 1);
5010 while (*ss == ' ') /* skip leading spaces */
5011 ++ss;
5013 sp = lstr;
5014 while ((*sp++ = *ss++) != '\0')
5016 s = lstr;
5018 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
5020 base = 16;
5021 s += 2;
5024 rndsav = rndprc;
5025 rndprc = NBITS; /* Set to full precision */
5026 lost = 0;
5027 nsign = 0;
5028 decflg = 0;
5029 sgnflg = 0;
5030 nexp = 0;
5031 exp = 0;
5032 prec = 0;
5033 ecleaz (yy);
5034 trail = 0;
5036 nxtcom:
5037 k = hex_value (*s);
5038 if ((k >= 0) && (k < base))
5040 /* Ignore leading zeros */
5041 if ((prec == 0) && (decflg == 0) && (k == 0))
5042 goto donchr;
5043 /* Identify and strip trailing zeros after the decimal point. */
5044 if ((trail == 0) && (decflg != 0))
5046 sp = s;
5047 while (ISDIGIT (*sp) || (base == 16 && ISXDIGIT (*sp)))
5048 ++sp;
5049 /* Check for syntax error */
5050 c = *sp & CHARMASK;
5051 if ((base != 10 || ((c != 'e') && (c != 'E')))
5052 && (base != 16 || ((c != 'p') && (c != 'P')))
5053 && (c != '\0')
5054 && (c != '\n') && (c != '\r') && (c != ' ')
5055 && (c != ','))
5056 goto unexpected_char_error;
5057 --sp;
5058 while (*sp == '0')
5059 *sp-- = 'z';
5060 trail = 1;
5061 if (*s == 'z')
5062 goto donchr;
5065 /* If enough digits were given to more than fill up the yy register,
5066 continuing until overflow into the high guard word yy[2]
5067 guarantees that there will be a roundoff bit at the top
5068 of the low guard word after normalization. */
5070 if (yy[2] == 0)
5072 if (base == 16)
5074 if (decflg)
5075 nexp += 4; /* count digits after decimal point */
5077 eshup1 (yy); /* multiply current number by 16 */
5078 eshup1 (yy);
5079 eshup1 (yy);
5080 eshup1 (yy);
5082 else
5084 if (decflg)
5085 nexp += 1; /* count digits after decimal point */
5087 eshup1 (yy); /* multiply current number by 10 */
5088 emovz (yy, xt);
5089 eshup1 (xt);
5090 eshup1 (xt);
5091 eaddm (xt, yy);
5093 /* Insert the current digit. */
5094 ecleaz (xt);
5095 xt[NI - 2] = (UEMUSHORT) k;
5096 eaddm (xt, yy);
5098 else
5100 /* Mark any lost non-zero digit. */
5101 lost |= k;
5102 /* Count lost digits before the decimal point. */
5103 if (decflg == 0)
5105 if (base == 10)
5106 nexp -= 1;
5107 else
5108 nexp -= 4;
5111 prec += 1;
5112 goto donchr;
5115 switch (*s)
5117 case 'z':
5118 break;
5119 case 'E':
5120 case 'e':
5121 case 'P':
5122 case 'p':
5123 goto expnt;
5124 case '.': /* decimal point */
5125 if (decflg)
5126 goto unexpected_char_error;
5127 ++decflg;
5128 break;
5129 case '-':
5130 nsign = 0xffff;
5131 if (sgnflg)
5132 goto unexpected_char_error;
5133 ++sgnflg;
5134 break;
5135 case '+':
5136 if (sgnflg)
5137 goto unexpected_char_error;
5138 ++sgnflg;
5139 break;
5140 case ',':
5141 case ' ':
5142 case '\0':
5143 case '\n':
5144 case '\r':
5145 goto daldone;
5146 case 'i':
5147 case 'I':
5148 goto infinite;
5149 default:
5150 unexpected_char_error:
5151 #ifdef NANS
5152 einan (yy);
5153 #else
5154 mtherr ("asctoe", DOMAIN);
5155 eclear (yy);
5156 #endif
5157 goto aexit;
5159 donchr:
5160 ++s;
5161 goto nxtcom;
5163 /* Exponent interpretation */
5164 expnt:
5165 /* 0.0eXXX is zero, regardless of XXX. Check for the 0.0. */
5166 for (k = 0; k < NI; k++)
5168 if (yy[k] != 0)
5169 goto read_expnt;
5171 goto aexit;
5173 read_expnt:
5174 esign = 1;
5175 exp = 0;
5176 ++s;
5177 /* check for + or - */
5178 if (*s == '-')
5180 esign = -1;
5181 ++s;
5183 if (*s == '+')
5184 ++s;
5185 while (ISDIGIT (*s))
5187 exp *= 10;
5188 exp += *s++ - '0';
5189 if (exp > 999999)
5190 break;
5192 if (esign < 0)
5193 exp = -exp;
5194 if ((exp > MAXDECEXP) && (base == 10))
5196 infinite:
5197 ecleaz (yy);
5198 yy[E] = 0x7fff; /* infinity */
5199 goto aexit;
5201 if ((exp < MINDECEXP) && (base == 10))
5203 zero:
5204 ecleaz (yy);
5205 goto aexit;
5208 daldone:
5209 if (base == 16)
5211 /* Base 16 hexadecimal floating constant. */
5212 if ((k = enormlz (yy)) > NBITS)
5214 ecleaz (yy);
5215 goto aexit;
5217 /* Adjust the exponent. NEXP is the number of hex digits,
5218 EXP is a power of 2. */
5219 lexp = (EXONE - 1 + NBITS) - k + yy[E] + exp - nexp;
5220 if (lexp > 0x7fff)
5221 goto infinite;
5222 if (lexp < 0)
5223 goto zero;
5224 yy[E] = lexp;
5225 goto expdon;
5228 nexp = exp - nexp;
5229 /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
5230 while ((nexp > 0) && (yy[2] == 0))
5232 emovz (yy, xt);
5233 eshup1 (xt);
5234 eshup1 (xt);
5235 eaddm (yy, xt);
5236 eshup1 (xt);
5237 if (xt[2] != 0)
5238 break;
5239 nexp -= 1;
5240 emovz (xt, yy);
5242 if ((k = enormlz (yy)) > NBITS)
5244 ecleaz (yy);
5245 goto aexit;
5247 lexp = (EXONE - 1 + NBITS) - k;
5248 emdnorm (yy, lost, 0, lexp, 64);
5249 lost = 0;
5251 /* Convert to external format:
5253 Multiply by 10**nexp. If precision is 64 bits,
5254 the maximum relative error incurred in forming 10**n
5255 for 0 <= n <= 324 is 8.2e-20, at 10**180.
5256 For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
5257 For 0 >= n >= -999, it is -1.55e-19 at 10**-435. */
5259 lexp = yy[E];
5260 if (nexp == 0)
5262 k = 0;
5263 goto expdon;
5265 esign = 1;
5266 if (nexp < 0)
5268 nexp = -nexp;
5269 esign = -1;
5270 if (nexp > 4096)
5272 /* Punt. Can't handle this without 2 divides. */
5273 emovi (etens[0], tt);
5274 lexp -= tt[E];
5275 k = edivm (tt, yy);
5276 lexp += EXONE;
5277 nexp -= 4096;
5280 emov (eone, xt);
5281 exp = 1;
5282 i = NTEN;
5285 if (exp & nexp)
5286 emul (etens[i], xt, xt);
5287 i--;
5288 exp = exp + exp;
5290 while (exp <= MAXP);
5292 emovi (xt, tt);
5293 if (esign < 0)
5295 lexp -= tt[E];
5296 k = edivm (tt, yy);
5297 lexp += EXONE;
5299 else
5301 lexp += tt[E];
5302 k = emulm (tt, yy);
5303 lexp -= EXONE - 1;
5305 lost = k;
5307 expdon:
5309 /* Round and convert directly to the destination type */
5310 if (oprec == 53)
5311 lexp -= EXONE - 0x3ff;
5312 #ifdef C4X
5313 else if (oprec == 24 || oprec == 32)
5314 lexp -= (EXONE - 0x7f);
5315 #else
5316 #ifdef IBM
5317 else if (oprec == 24 || oprec == 56)
5318 lexp -= EXONE - (0x41 << 2);
5319 #else
5320 #ifdef DEC
5321 else if (oprec == 24)
5322 lexp -= dec_f.adjustment;
5323 else if (oprec == 56)
5325 if (TARGET_G_FLOAT)
5326 lexp -= dec_g.adjustment;
5327 else
5328 lexp -= dec_d.adjustment;
5330 #else
5331 else if (oprec == 24)
5332 lexp -= EXONE - 0177;
5333 #endif /* DEC */
5334 #endif /* IBM */
5335 #endif /* C4X */
5336 rndprc = oprec;
5337 emdnorm (yy, lost, 0, lexp, 64);
5339 aexit:
5341 rndprc = rndsav;
5342 yy[0] = nsign;
5343 switch (oprec)
5345 #ifdef DEC
5346 case 56:
5347 todec (yy, y);
5348 break;
5349 #endif
5350 #ifdef IBM
5351 case 56:
5352 toibm (yy, y, DFmode);
5353 break;
5354 #endif
5355 #ifdef C4X
5356 case 32:
5357 toc4x (yy, y, HFmode);
5358 break;
5359 #endif
5361 case 53:
5362 toe53 (yy, y);
5363 break;
5364 case 24:
5365 toe24 (yy, y);
5366 break;
5367 case 64:
5368 toe64 (yy, y);
5369 break;
5370 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
5371 case 113:
5372 toe113 (yy, y);
5373 break;
5374 #endif
5375 case NBITS:
5376 emovo (yy, y);
5377 break;
5383 /* Return Y = largest integer not greater than X (truncated toward minus
5384 infinity). */
5386 static const UEMUSHORT bmask[] =
5388 0xffff,
5389 0xfffe,
5390 0xfffc,
5391 0xfff8,
5392 0xfff0,
5393 0xffe0,
5394 0xffc0,
5395 0xff80,
5396 0xff00,
5397 0xfe00,
5398 0xfc00,
5399 0xf800,
5400 0xf000,
5401 0xe000,
5402 0xc000,
5403 0x8000,
5404 0x0000,
5407 static void
5408 efloor (x, y)
5409 const UEMUSHORT x[];
5410 UEMUSHORT y[];
5412 UEMUSHORT *p;
5413 int e, expon, i;
5414 UEMUSHORT f[NE];
5416 emov (x, f); /* leave in external format */
5417 expon = (int) f[NE - 1];
5418 e = (expon & 0x7fff) - (EXONE - 1);
5419 if (e <= 0)
5421 eclear (y);
5422 goto isitneg;
5424 /* number of bits to clear out */
5425 e = NBITS - e;
5426 emov (f, y);
5427 if (e <= 0)
5428 return;
5430 p = &y[0];
5431 while (e >= 16)
5433 *p++ = 0;
5434 e -= 16;
5436 /* clear the remaining bits */
5437 *p &= bmask[e];
5438 /* truncate negatives toward minus infinity */
5439 isitneg:
5441 if ((UEMUSHORT) expon & (UEMUSHORT) 0x8000)
5443 for (i = 0; i < NE - 1; i++)
5445 if (f[i] != y[i])
5447 esub (eone, y, y);
5448 break;
5455 #if 0
5456 /* Return S and EXP such that S * 2^EXP = X and .5 <= S < 1.
5457 For example, 1.1 = 0.55 * 2^1. */
5459 static void
5460 efrexp (x, exp, s)
5461 const UEMUSHORT x[];
5462 int *exp;
5463 UEMUSHORT s[];
5465 UEMUSHORT xi[NI];
5466 EMULONG li;
5468 emovi (x, xi);
5469 /* Handle denormalized numbers properly using long integer exponent. */
5470 li = (EMULONG) ((EMUSHORT) xi[1]);
5472 if (li == 0)
5474 li -= enormlz (xi);
5476 xi[1] = 0x3ffe;
5477 emovo (xi, s);
5478 *exp = (int) (li - 0x3ffe);
5480 #endif
5482 /* Return e type Y = X * 2^PWR2. */
5484 static void
5485 eldexp (x, pwr2, y)
5486 const UEMUSHORT x[];
5487 int pwr2;
5488 UEMUSHORT y[];
5490 UEMUSHORT xi[NI];
5491 EMULONG li;
5492 int i;
5494 emovi (x, xi);
5495 li = xi[1];
5496 li += pwr2;
5497 i = 0;
5498 emdnorm (xi, i, i, li, !ROUND_TOWARDS_ZERO);
5499 emovo (xi, y);
5503 #if 0
5504 /* C = remainder after dividing B by A, all e type values.
5505 Least significant integer quotient bits left in EQUOT. */
5507 static void
5508 eremain (a, b, c)
5509 const UEMUSHORT a[], b[];
5510 UEMUSHORT c[];
5512 UEMUSHORT den[NI], num[NI];
5514 #ifdef NANS
5515 if (eisinf (b)
5516 || (ecmp (a, ezero) == 0)
5517 || eisnan (a)
5518 || eisnan (b))
5520 enan (c, 0);
5521 return;
5523 #endif
5524 if (ecmp (a, ezero) == 0)
5526 mtherr ("eremain", SING);
5527 eclear (c);
5528 return;
5530 emovi (a, den);
5531 emovi (b, num);
5532 eiremain (den, num);
5533 /* Sign of remainder = sign of quotient */
5534 if (a[0] == b[0])
5535 num[0] = 0;
5536 else
5537 num[0] = 0xffff;
5538 emovo (num, c);
5540 #endif
5542 /* Return quotient of exploded e-types NUM / DEN in EQUOT,
5543 remainder in NUM. */
5545 static void
5546 eiremain (den, num)
5547 UEMUSHORT den[], num[];
5549 EMULONG ld, ln;
5550 UEMUSHORT j;
5552 ld = den[E];
5553 ld -= enormlz (den);
5554 ln = num[E];
5555 ln -= enormlz (num);
5556 ecleaz (equot);
5557 while (ln >= ld)
5559 if (ecmpm (den, num) <= 0)
5561 esubm (den, num);
5562 j = 1;
5564 else
5565 j = 0;
5566 eshup1 (equot);
5567 equot[NI - 1] |= j;
5568 eshup1 (num);
5569 ln -= 1;
5571 emdnorm (num, 0, 0, ln, 0);
5574 /* Report an error condition CODE encountered in function NAME.
5576 Mnemonic Value Significance
5578 DOMAIN 1 argument domain error
5579 SING 2 function singularity
5580 OVERFLOW 3 overflow range error
5581 UNDERFLOW 4 underflow range error
5582 TLOSS 5 total loss of precision
5583 PLOSS 6 partial loss of precision
5584 INVALID 7 NaN - producing operation
5585 EDOM 33 Unix domain error code
5586 ERANGE 34 Unix range error code
5588 The order of appearance of the following messages is bound to the
5589 error codes defined above. */
5591 int merror = 0;
5592 extern int merror;
5594 static void
5595 mtherr (name, code)
5596 const char *name;
5597 int code;
5599 /* The string passed by the calling program is supposed to be the
5600 name of the function in which the error occurred.
5601 The code argument selects which error message string will be printed. */
5603 if (strcmp (name, "esub") == 0)
5604 name = "subtraction";
5605 else if (strcmp (name, "ediv") == 0)
5606 name = "division";
5607 else if (strcmp (name, "emul") == 0)
5608 name = "multiplication";
5609 else if (strcmp (name, "enormlz") == 0)
5610 name = "normalization";
5611 else if (strcmp (name, "etoasc") == 0)
5612 name = "conversion to text";
5613 else if (strcmp (name, "asctoe") == 0)
5614 name = "parsing";
5615 else if (strcmp (name, "eremain") == 0)
5616 name = "modulus";
5617 else if (strcmp (name, "esqrt") == 0)
5618 name = "square root";
5619 if (extra_warnings)
5621 switch (code)
5623 case DOMAIN: warning ("%s: argument domain error" , name); break;
5624 case SING: warning ("%s: function singularity" , name); break;
5625 case OVERFLOW: warning ("%s: overflow range error" , name); break;
5626 case UNDERFLOW: warning ("%s: underflow range error" , name); break;
5627 case TLOSS: warning ("%s: total loss of precision" , name); break;
5628 case PLOSS: warning ("%s: partial loss of precision", name); break;
5629 case INVALID: warning ("%s: NaN - producing operation", name); break;
5630 default: abort ();
5634 /* Set global error message word */
5635 merror = code + 1;
5638 #ifdef DEC
5639 /* Convert DEC double precision D to e type E. */
5641 static void
5642 dectoe (d, e)
5643 const UEMUSHORT *d;
5644 UEMUSHORT *e;
5646 if (TARGET_G_FLOAT)
5647 ieeetoe (d, e, &dec_g);
5648 else
5649 ieeetoe (d, e, &dec_d);
5652 /* Convert e type X to DEC double precision D. */
5654 static void
5655 etodec (x, d)
5656 const UEMUSHORT *x;
5657 UEMUSHORT *d;
5659 UEMUSHORT xi[NI];
5660 EMULONG exp;
5661 int rndsav;
5662 const struct ieee_format *fmt;
5664 if (TARGET_G_FLOAT)
5665 fmt = &dec_g;
5666 else
5667 fmt = &dec_d;
5669 emovi (x, xi);
5670 /* Adjust exponent for offsets. */
5671 exp = (EMULONG) xi[E] - fmt->adjustment;
5672 /* Round off to nearest or even. */
5673 rndsav = rndprc;
5674 rndprc = fmt->precision;
5675 emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
5676 rndprc = rndsav;
5677 todec (xi, d);
5680 /* Convert exploded e-type X, that has already been rounded to
5681 56-bit precision, to DEC format double Y. */
5683 static void
5684 todec (x, y)
5685 UEMUSHORT *x, *y;
5687 if (TARGET_G_FLOAT)
5688 toieee (x, y, &dec_g);
5689 else
5690 toieee (x, y, &dec_d);
5692 #endif /* DEC */
5694 #ifdef IBM
5695 /* Convert IBM single/double precision to e type. */
5697 static void
5698 ibmtoe (d, e, mode)
5699 const UEMUSHORT *d;
5700 UEMUSHORT *e;
5701 enum machine_mode mode;
5703 UEMUSHORT y[NI];
5704 UEMUSHORT r, *p;
5706 ecleaz (y); /* start with a zero */
5707 p = y; /* point to our number */
5708 r = *d; /* get IBM exponent word */
5709 if (*d & (unsigned int) 0x8000)
5710 *p = 0xffff; /* fill in our sign */
5711 ++p; /* bump pointer to our exponent word */
5712 r &= 0x7f00; /* strip the sign bit */
5713 r >>= 6; /* shift exponent word down 6 bits */
5714 /* in fact shift by 8 right and 2 left */
5715 r += EXONE - (0x41 << 2); /* subtract IBM exponent offset */
5716 /* add our e type exponent offset */
5717 *p++ = r; /* to form our exponent */
5719 *p++ = *d++ & 0xff; /* now do the high order mantissa */
5720 /* strip off the IBM exponent and sign bits */
5721 if (mode != SFmode) /* there are only 2 words in SFmode */
5723 *p++ = *d++; /* fill in the rest of our mantissa */
5724 *p++ = *d++;
5726 *p = *d;
5728 if (y[M] == 0 && y[M+1] == 0 && y[M+2] == 0 && y[M+3] == 0)
5729 y[0] = y[E] = 0;
5730 else
5731 y[E] -= 5 + enormlz (y); /* now normalise the mantissa */
5732 /* handle change in RADIX */
5733 emovo (y, e);
5738 /* Convert e type to IBM single/double precision. */
5740 static void
5741 etoibm (x, d, mode)
5742 const UEMUSHORT *x;
5743 UEMUSHORT *d;
5744 enum machine_mode mode;
5746 UEMUSHORT xi[NI];
5747 EMULONG exp;
5748 int rndsav;
5750 emovi (x, xi);
5751 exp = (EMULONG) xi[E] - (EXONE - (0x41 << 2)); /* adjust exponent for offsets */
5752 /* round off to nearest or even */
5753 rndsav = rndprc;
5754 rndprc = 56;
5755 emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
5756 rndprc = rndsav;
5757 toibm (xi, d, mode);
5760 static void
5761 toibm (x, y, mode)
5762 UEMUSHORT *x, *y;
5763 enum machine_mode mode;
5765 UEMUSHORT i;
5766 UEMUSHORT *p;
5767 int r;
5769 p = x;
5770 *y = 0;
5771 if (*p++)
5772 *y = 0x8000;
5773 i = *p++;
5774 if (i == 0)
5776 *y++ = 0;
5777 *y++ = 0;
5778 if (mode != SFmode)
5780 *y++ = 0;
5781 *y++ = 0;
5783 return;
5785 r = i & 0x3;
5786 i >>= 2;
5787 if (i > 0x7f)
5789 *y++ |= 0x7fff;
5790 *y++ = 0xffff;
5791 if (mode != SFmode)
5793 *y++ = 0xffff;
5794 *y++ = 0xffff;
5796 #ifdef ERANGE
5797 errno = ERANGE;
5798 #endif
5799 return;
5801 i &= 0x7f;
5802 *y |= (i << 8);
5803 eshift (x, r + 5);
5804 *y++ |= x[M];
5805 *y++ = x[M + 1];
5806 if (mode != SFmode)
5808 *y++ = x[M + 2];
5809 *y++ = x[M + 3];
5812 #endif /* IBM */
5815 #ifdef C4X
5816 /* Convert C4X single/double precision to e type. */
5818 static void
5819 c4xtoe (d, e, mode)
5820 const UEMUSHORT *d;
5821 UEMUSHORT *e;
5822 enum machine_mode mode;
5824 UEMUSHORT y[NI];
5825 UEMUSHORT dn[4];
5826 int r;
5827 int isnegative;
5828 int size;
5829 int i;
5830 int carry;
5832 dn[0] = d[0];
5833 dn[1] = d[1];
5834 if (mode != QFmode)
5836 dn[2] = d[3] << 8;
5837 dn[3] = 0;
5840 /* Short-circuit the zero case. */
5841 if ((dn[0] == 0x8000)
5842 && (dn[1] == 0x0000)
5843 && ((mode == QFmode) || ((dn[2] == 0x0000) && (dn[3] == 0x0000))))
5845 e[0] = 0;
5846 e[1] = 0;
5847 e[2] = 0;
5848 e[3] = 0;
5849 e[4] = 0;
5850 e[5] = 0;
5851 return;
5854 ecleaz (y); /* start with a zero */
5855 r = dn[0]; /* get sign/exponent part */
5856 if (r & (unsigned int) 0x0080)
5858 y[0] = 0xffff; /* fill in our sign */
5859 isnegative = TRUE;
5861 else
5862 isnegative = FALSE;
5864 r >>= 8; /* Shift exponent word down 8 bits. */
5865 if (r & 0x80) /* Make the exponent negative if it is. */
5866 r = r | (~0 & ~0xff);
5868 if (isnegative)
5870 /* Now do the high order mantissa. We don't "or" on the high bit
5871 because it is 2 (not 1) and is handled a little differently
5872 below. */
5873 y[M] = dn[0] & 0x7f;
5875 y[M+1] = dn[1];
5876 if (mode != QFmode) /* There are only 2 words in QFmode. */
5878 y[M+2] = dn[2]; /* Fill in the rest of our mantissa. */
5879 y[M+3] = dn[3];
5880 size = 4;
5882 else
5883 size = 2;
5884 eshift (y, -8);
5886 /* Now do the two's complement on the data. */
5888 carry = 1; /* Initially add 1 for the two's complement. */
5889 for (i=size + M; i > M; i--)
5891 if (carry && (y[i] == 0x0000))
5892 /* We overflowed into the next word, carry is the same. */
5893 y[i] = carry ? 0x0000 : 0xffff;
5894 else
5896 /* No overflow, just invert and add carry. */
5897 y[i] = ((~y[i]) + carry) & 0xffff;
5898 carry = 0;
5902 if (carry)
5904 eshift (y, -1);
5905 y[M+1] |= 0x8000;
5906 r++;
5908 y[1] = r + EXONE;
5910 else
5912 /* Add our e type exponent offset to form our exponent. */
5913 r += EXONE;
5914 y[1] = r;
5916 /* Now do the high order mantissa strip off the exponent and sign
5917 bits and add the high 1 bit. */
5918 y[M] = (dn[0] & 0x7f) | 0x80;
5920 y[M+1] = dn[1];
5921 if (mode != QFmode) /* There are only 2 words in QFmode. */
5923 y[M+2] = dn[2]; /* Fill in the rest of our mantissa. */
5924 y[M+3] = dn[3];
5926 eshift (y, -8);
5929 emovo (y, e);
5933 /* Convert e type to C4X single/double precision. */
5935 static void
5936 etoc4x (x, d, mode)
5937 const UEMUSHORT *x;
5938 UEMUSHORT *d;
5939 enum machine_mode mode;
5941 UEMUSHORT xi[NI];
5942 EMULONG exp;
5943 int rndsav;
5945 emovi (x, xi);
5947 /* Adjust exponent for offsets. */
5948 exp = (EMULONG) xi[E] - (EXONE - 0x7f);
5950 /* Round off to nearest or even. */
5951 rndsav = rndprc;
5952 rndprc = mode == QFmode ? 24 : 32;
5953 emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
5954 rndprc = rndsav;
5955 toc4x (xi, d, mode);
5958 static void
5959 toc4x (x, y, mode)
5960 UEMUSHORT *x, *y;
5961 enum machine_mode mode;
5963 int i;
5964 int v;
5965 int carry;
5967 /* Short-circuit the zero case */
5968 if ((x[0] == 0) /* Zero exponent and sign */
5969 && (x[1] == 0)
5970 && (x[M] == 0) /* The rest is for zero mantissa */
5971 && (x[M+1] == 0)
5972 /* Only check for double if necessary */
5973 && ((mode == QFmode) || ((x[M+2] == 0) && (x[M+3] == 0))))
5975 /* We have a zero. Put it into the output and return. */
5976 *y++ = 0x8000;
5977 *y++ = 0x0000;
5978 if (mode != QFmode)
5980 *y++ = 0x0000;
5981 *y++ = 0x0000;
5983 return;
5986 *y = 0;
5988 /* Negative number require a two's complement conversion of the
5989 mantissa. */
5990 if (x[0])
5992 *y = 0x0080;
5994 i = ((int) x[1]) - 0x7f;
5996 /* Now add 1 to the inverted data to do the two's complement. */
5997 if (mode != QFmode)
5998 v = 4 + M;
5999 else
6000 v = 2 + M;
6001 carry = 1;
6002 while (v > M)
6004 if (x[v] == 0x0000)
6005 x[v] = carry ? 0x0000 : 0xffff;
6006 else
6008 x[v] = ((~x[v]) + carry) & 0xffff;
6009 carry = 0;
6011 v--;
6014 /* The following is a special case. The C4X negative float requires
6015 a zero in the high bit (because the format is (2 - x) x 2^m), so
6016 if a one is in that bit, we have to shift left one to get rid
6017 of it. This only occurs if the number is -1 x 2^m. */
6018 if (x[M+1] & 0x8000)
6020 /* This is the case of -1 x 2^m, we have to rid ourselves of the
6021 high sign bit and shift the exponent. */
6022 eshift (x, 1);
6023 i--;
6026 else
6027 i = ((int) x[1]) - 0x7f;
6029 if ((i < -128) || (i > 127))
6031 y[0] |= 0xff7f;
6032 y[1] = 0xffff;
6033 if (mode != QFmode)
6035 y[2] = 0xffff;
6036 y[3] = 0xffff;
6037 y[3] = (y[1] << 8) | ((y[2] >> 8) & 0xff);
6038 y[2] = (y[0] << 8) | ((y[1] >> 8) & 0xff);
6040 #ifdef ERANGE
6041 errno = ERANGE;
6042 #endif
6043 return;
6046 y[0] |= ((i & 0xff) << 8);
6048 eshift (x, 8);
6050 y[0] |= x[M] & 0x7f;
6051 y[1] = x[M + 1];
6052 if (mode != QFmode)
6054 y[2] = x[M + 2];
6055 y[3] = x[M + 3];
6056 y[3] = (y[1] << 8) | ((y[2] >> 8) & 0xff);
6057 y[2] = (y[0] << 8) | ((y[1] >> 8) & 0xff);
6060 #endif /* C4X */
6062 /* Output a binary NaN bit pattern in the target machine's format. */
6064 /* If special NaN bit patterns are required, define them in tm.h
6065 as arrays of unsigned 16-bit shorts. Otherwise, use the default
6066 patterns here. */
6067 #ifdef TFMODE_NAN
6068 TFMODE_NAN;
6069 #else
6070 #if defined (IEEE) && (INTEL_EXTENDED_IEEE_FORMAT == 0)
6071 static const UEMUSHORT TFbignan[8] =
6072 {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
6073 static const UEMUSHORT TFlittlenan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
6074 #endif
6075 #endif
6077 #ifdef XFMODE_NAN
6078 XFMODE_NAN;
6079 #else
6080 #ifdef IEEE
6081 static const UEMUSHORT XFbignan[6] =
6082 {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
6083 static const UEMUSHORT XFlittlenan[6] = {0, 0, 0, 0xc000, 0xffff, 0};
6084 #endif
6085 #endif
6087 #ifdef DFMODE_NAN
6088 DFMODE_NAN;
6089 #else
6090 #ifdef IEEE
6091 static const UEMUSHORT DFbignan[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
6092 static const UEMUSHORT DFlittlenan[4] = {0, 0, 0, 0xfff8};
6093 #endif
6094 #endif
6096 #ifdef SFMODE_NAN
6097 SFMODE_NAN;
6098 #else
6099 #ifdef IEEE
6100 static const UEMUSHORT SFbignan[2] = {0x7fff, 0xffff};
6101 static const UEMUSHORT SFlittlenan[2] = {0, 0xffc0};
6102 #endif
6103 #endif
6106 #ifdef NANS
6107 static void
6108 make_nan (nan, sign, mode)
6109 UEMUSHORT *nan;
6110 int sign;
6111 enum machine_mode mode;
6113 int n;
6114 const UEMUSHORT *p;
6115 int size;
6117 size = GET_MODE_BITSIZE (mode);
6118 if (LARGEST_EXPONENT_IS_NORMAL (size))
6120 warning ("%d-bit floats cannot hold NaNs", size);
6121 saturate (nan, sign, size, 0);
6122 return;
6124 switch (mode)
6126 /* Possibly the `reserved operand' patterns on a VAX can be
6127 used like NaN's, but probably not in the same way as IEEE. */
6128 #if !defined(DEC) && !defined(IBM) && !defined(C4X)
6129 case TFmode:
6130 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
6131 n = 8;
6132 if (REAL_WORDS_BIG_ENDIAN)
6133 p = TFbignan;
6134 else
6135 p = TFlittlenan;
6136 break;
6137 #endif
6138 /* FALLTHRU */
6140 case XFmode:
6141 n = 6;
6142 if (REAL_WORDS_BIG_ENDIAN)
6143 p = XFbignan;
6144 else
6145 p = XFlittlenan;
6146 break;
6148 case DFmode:
6149 n = 4;
6150 if (REAL_WORDS_BIG_ENDIAN)
6151 p = DFbignan;
6152 else
6153 p = DFlittlenan;
6154 break;
6156 case SFmode:
6157 case HFmode:
6158 n = 2;
6159 if (REAL_WORDS_BIG_ENDIAN)
6160 p = SFbignan;
6161 else
6162 p = SFlittlenan;
6163 break;
6164 #endif
6166 default:
6167 abort ();
6169 if (REAL_WORDS_BIG_ENDIAN)
6170 *nan++ = (sign << 15) | (*p++ & 0x7fff);
6171 while (--n != 0)
6172 *nan++ = *p++;
6173 if (! REAL_WORDS_BIG_ENDIAN)
6174 *nan = (sign << 15) | (*p & 0x7fff);
6176 #endif /* NANS */
6179 /* Create a saturation value for a SIZE-bit float, assuming that
6180 LARGEST_EXPONENT_IS_NORMAL (SIZE).
6182 If SIGN is true, fill X with the most negative value, otherwise fill
6183 it with the most positive value. WARN is true if the function should
6184 warn about overflow. */
6186 static void
6187 saturate (x, sign, size, warn)
6188 UEMUSHORT *x;
6189 int sign, size, warn;
6191 int i;
6193 if (warn && extra_warnings)
6194 warning ("value exceeds the range of a %d-bit float", size);
6196 /* Create the most negative value. */
6197 for (i = 0; i < size / EMUSHORT_SIZE; i++)
6198 x[i] = 0xffff;
6200 /* Make it positive, if necessary. */
6201 if (!sign)
6202 x[REAL_WORDS_BIG_ENDIAN? 0 : i - 1] = 0x7fff;
6206 /* This is the inverse of the function `etarsingle' invoked by
6207 REAL_VALUE_TO_TARGET_SINGLE. */
6209 REAL_VALUE_TYPE
6210 ereal_unto_float (f)
6211 long f;
6213 REAL_VALUE_TYPE r;
6214 UEMUSHORT s[2];
6215 UEMUSHORT e[NE];
6217 /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
6218 This is the inverse operation to what the function `endian' does. */
6219 if (REAL_WORDS_BIG_ENDIAN)
6221 s[0] = (UEMUSHORT) (f >> 16);
6222 s[1] = (UEMUSHORT) f;
6224 else
6226 s[0] = (UEMUSHORT) f;
6227 s[1] = (UEMUSHORT) (f >> 16);
6229 /* Convert and promote the target float to E-type. */
6230 e24toe (s, e);
6231 /* Output E-type to REAL_VALUE_TYPE. */
6232 PUT_REAL (e, &r);
6233 return r;
6237 /* This is the inverse of the function `etardouble' invoked by
6238 REAL_VALUE_TO_TARGET_DOUBLE. */
6240 REAL_VALUE_TYPE
6241 ereal_unto_double (d)
6242 long d[];
6244 REAL_VALUE_TYPE r;
6245 UEMUSHORT s[4];
6246 UEMUSHORT e[NE];
6248 /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
6249 if (REAL_WORDS_BIG_ENDIAN)
6251 s[0] = (UEMUSHORT) (d[0] >> 16);
6252 s[1] = (UEMUSHORT) d[0];
6253 s[2] = (UEMUSHORT) (d[1] >> 16);
6254 s[3] = (UEMUSHORT) d[1];
6256 else
6258 /* Target float words are little-endian. */
6259 s[0] = (UEMUSHORT) d[0];
6260 s[1] = (UEMUSHORT) (d[0] >> 16);
6261 s[2] = (UEMUSHORT) d[1];
6262 s[3] = (UEMUSHORT) (d[1] >> 16);
6264 /* Convert target double to E-type. */
6265 e53toe (s, e);
6266 /* Output E-type to REAL_VALUE_TYPE. */
6267 PUT_REAL (e, &r);
6268 return r;
6272 /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
6273 This is somewhat like ereal_unto_float, but the input types
6274 for these are different. */
6276 REAL_VALUE_TYPE
6277 ereal_from_float (f)
6278 HOST_WIDE_INT f;
6280 REAL_VALUE_TYPE r;
6281 UEMUSHORT s[2];
6282 UEMUSHORT e[NE];
6284 /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
6285 This is the inverse operation to what the function `endian' does. */
6286 if (REAL_WORDS_BIG_ENDIAN)
6288 s[0] = (UEMUSHORT) (f >> 16);
6289 s[1] = (UEMUSHORT) f;
6291 else
6293 s[0] = (UEMUSHORT) f;
6294 s[1] = (UEMUSHORT) (f >> 16);
6296 /* Convert and promote the target float to E-type. */
6297 e24toe (s, e);
6298 /* Output E-type to REAL_VALUE_TYPE. */
6299 PUT_REAL (e, &r);
6300 return r;
6304 /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
6305 This is somewhat like ereal_unto_double, but the input types
6306 for these are different.
6308 The DFmode is stored as an array of HOST_WIDE_INT in the target's
6309 data format, with no holes in the bit packing. The first element
6310 of the input array holds the bits that would come first in the
6311 target computer's memory. */
6313 REAL_VALUE_TYPE
6314 ereal_from_double (d)
6315 HOST_WIDE_INT d[];
6317 REAL_VALUE_TYPE r;
6318 UEMUSHORT s[4];
6319 UEMUSHORT e[NE];
6321 /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
6322 if (REAL_WORDS_BIG_ENDIAN)
6324 #if HOST_BITS_PER_WIDE_INT == 32
6325 s[0] = (UEMUSHORT) (d[0] >> 16);
6326 s[1] = (UEMUSHORT) d[0];
6327 s[2] = (UEMUSHORT) (d[1] >> 16);
6328 s[3] = (UEMUSHORT) d[1];
6329 #else
6330 /* In this case the entire target double is contained in the
6331 first array element. The second element of the input is
6332 ignored. */
6333 s[0] = (UEMUSHORT) (d[0] >> 48);
6334 s[1] = (UEMUSHORT) (d[0] >> 32);
6335 s[2] = (UEMUSHORT) (d[0] >> 16);
6336 s[3] = (UEMUSHORT) d[0];
6337 #endif
6339 else
6341 /* Target float words are little-endian. */
6342 s[0] = (UEMUSHORT) d[0];
6343 s[1] = (UEMUSHORT) (d[0] >> 16);
6344 #if HOST_BITS_PER_WIDE_INT == 32
6345 s[2] = (UEMUSHORT) d[1];
6346 s[3] = (UEMUSHORT) (d[1] >> 16);
6347 #else
6348 s[2] = (UEMUSHORT) (d[0] >> 32);
6349 s[3] = (UEMUSHORT) (d[0] >> 48);
6350 #endif
6352 /* Convert target double to E-type. */
6353 e53toe (s, e);
6354 /* Output E-type to REAL_VALUE_TYPE. */
6355 PUT_REAL (e, &r);
6356 return r;
6360 #if 0
6361 /* Convert target computer unsigned 64-bit integer to e-type.
6362 The endian-ness of DImode follows the convention for integers,
6363 so we use WORDS_BIG_ENDIAN here, not REAL_WORDS_BIG_ENDIAN. */
6365 static void
6366 uditoe (di, e)
6367 const UEMUSHORT *di; /* Address of the 64-bit int. */
6368 UEMUSHORT *e;
6370 UEMUSHORT yi[NI];
6371 int k;
6373 ecleaz (yi);
6374 if (WORDS_BIG_ENDIAN)
6376 for (k = M; k < M + 4; k++)
6377 yi[k] = *di++;
6379 else
6381 for (k = M + 3; k >= M; k--)
6382 yi[k] = *di++;
6384 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
6385 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
6386 ecleaz (yi); /* it was zero */
6387 else
6388 yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
6389 emovo (yi, e);
6392 /* Convert target computer signed 64-bit integer to e-type. */
6394 static void
6395 ditoe (di, e)
6396 const UEMUSHORT *di; /* Address of the 64-bit int. */
6397 UEMUSHORT *e;
6399 unsigned EMULONG acc;
6400 UEMUSHORT yi[NI];
6401 UEMUSHORT carry;
6402 int k, sign;
6404 ecleaz (yi);
6405 if (WORDS_BIG_ENDIAN)
6407 for (k = M; k < M + 4; k++)
6408 yi[k] = *di++;
6410 else
6412 for (k = M + 3; k >= M; k--)
6413 yi[k] = *di++;
6415 /* Take absolute value */
6416 sign = 0;
6417 if (yi[M] & 0x8000)
6419 sign = 1;
6420 carry = 0;
6421 for (k = M + 3; k >= M; k--)
6423 acc = (unsigned EMULONG) (~yi[k] & 0xffff) + carry;
6424 yi[k] = acc;
6425 carry = 0;
6426 if (acc & 0x10000)
6427 carry = 1;
6430 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
6431 if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
6432 ecleaz (yi); /* it was zero */
6433 else
6434 yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
6435 emovo (yi, e);
6436 if (sign)
6437 eneg (e);
6441 /* Convert e-type to unsigned 64-bit int. */
6443 static void
6444 etoudi (x, i)
6445 const UEMUSHORT *x;
6446 UEMUSHORT *i;
6448 UEMUSHORT xi[NI];
6449 int j, k;
6451 emovi (x, xi);
6452 if (xi[0])
6454 xi[M] = 0;
6455 goto noshift;
6457 k = (int) xi[E] - (EXONE - 1);
6458 if (k <= 0)
6460 for (j = 0; j < 4; j++)
6461 *i++ = 0;
6462 return;
6464 if (k > 64)
6466 for (j = 0; j < 4; j++)
6467 *i++ = 0xffff;
6468 if (extra_warnings)
6469 warning ("overflow on truncation to integer");
6470 return;
6472 if (k > 16)
6474 /* Shift more than 16 bits: first shift up k-16 mod 16,
6475 then shift up by 16's. */
6476 j = k - ((k >> 4) << 4);
6477 if (j == 0)
6478 j = 16;
6479 eshift (xi, j);
6480 if (WORDS_BIG_ENDIAN)
6481 *i++ = xi[M];
6482 else
6484 i += 3;
6485 *i-- = xi[M];
6487 k -= j;
6490 eshup6 (xi);
6491 if (WORDS_BIG_ENDIAN)
6492 *i++ = xi[M];
6493 else
6494 *i-- = xi[M];
6496 while ((k -= 16) > 0);
6498 else
6500 /* shift not more than 16 bits */
6501 eshift (xi, k);
6503 noshift:
6505 if (WORDS_BIG_ENDIAN)
6507 i += 3;
6508 *i-- = xi[M];
6509 *i-- = 0;
6510 *i-- = 0;
6511 *i = 0;
6513 else
6515 *i++ = xi[M];
6516 *i++ = 0;
6517 *i++ = 0;
6518 *i = 0;
6524 /* Convert e-type to signed 64-bit int. */
6526 static void
6527 etodi (x, i)
6528 const UEMUSHORT *x;
6529 UEMUSHORT *i;
6531 unsigned EMULONG acc;
6532 UEMUSHORT xi[NI];
6533 UEMUSHORT carry;
6534 UEMUSHORT *isave;
6535 int j, k;
6537 emovi (x, xi);
6538 k = (int) xi[E] - (EXONE - 1);
6539 if (k <= 0)
6541 for (j = 0; j < 4; j++)
6542 *i++ = 0;
6543 return;
6545 if (k > 64)
6547 for (j = 0; j < 4; j++)
6548 *i++ = 0xffff;
6549 if (extra_warnings)
6550 warning ("overflow on truncation to integer");
6551 return;
6553 isave = i;
6554 if (k > 16)
6556 /* Shift more than 16 bits: first shift up k-16 mod 16,
6557 then shift up by 16's. */
6558 j = k - ((k >> 4) << 4);
6559 if (j == 0)
6560 j = 16;
6561 eshift (xi, j);
6562 if (WORDS_BIG_ENDIAN)
6563 *i++ = xi[M];
6564 else
6566 i += 3;
6567 *i-- = xi[M];
6569 k -= j;
6572 eshup6 (xi);
6573 if (WORDS_BIG_ENDIAN)
6574 *i++ = xi[M];
6575 else
6576 *i-- = xi[M];
6578 while ((k -= 16) > 0);
6580 else
6582 /* shift not more than 16 bits */
6583 eshift (xi, k);
6585 if (WORDS_BIG_ENDIAN)
6587 i += 3;
6588 *i = xi[M];
6589 *i-- = 0;
6590 *i-- = 0;
6591 *i = 0;
6593 else
6595 *i++ = xi[M];
6596 *i++ = 0;
6597 *i++ = 0;
6598 *i = 0;
6601 /* Negate if negative */
6602 if (xi[0])
6604 carry = 0;
6605 if (WORDS_BIG_ENDIAN)
6606 isave += 3;
6607 for (k = 0; k < 4; k++)
6609 acc = (unsigned EMULONG) (~(*isave) & 0xffff) + carry;
6610 if (WORDS_BIG_ENDIAN)
6611 *isave-- = acc;
6612 else
6613 *isave++ = acc;
6614 carry = 0;
6615 if (acc & 0x10000)
6616 carry = 1;
6622 /* Longhand square root routine. */
6625 static int esqinited = 0;
6626 static unsigned short sqrndbit[NI];
6628 static void
6629 esqrt (x, y)
6630 const UEMUSHORT *x;
6631 UEMUSHORT *y;
6633 UEMUSHORT temp[NI], num[NI], sq[NI], xx[NI];
6634 EMULONG m, exp;
6635 int i, j, k, n, nlups;
6637 if (esqinited == 0)
6639 ecleaz (sqrndbit);
6640 sqrndbit[NI - 2] = 1;
6641 esqinited = 1;
6643 /* Check for arg <= 0 */
6644 i = ecmp (x, ezero);
6645 if (i <= 0)
6647 if (i == -1)
6649 mtherr ("esqrt", DOMAIN);
6650 eclear (y);
6652 else
6653 emov (x, y);
6654 return;
6657 #ifdef INFINITY
6658 if (eisinf (x))
6660 eclear (y);
6661 einfin (y);
6662 return;
6664 #endif
6665 /* Bring in the arg and renormalize if it is denormal. */
6666 emovi (x, xx);
6667 m = (EMULONG) xx[1]; /* local long word exponent */
6668 if (m == 0)
6669 m -= enormlz (xx);
6671 /* Divide exponent by 2 */
6672 m -= 0x3ffe;
6673 exp = (unsigned short) ((m / 2) + 0x3ffe);
6675 /* Adjust if exponent odd */
6676 if ((m & 1) != 0)
6678 if (m > 0)
6679 exp += 1;
6680 eshdn1 (xx);
6683 ecleaz (sq);
6684 ecleaz (num);
6685 n = 8; /* get 8 bits of result per inner loop */
6686 nlups = rndprc;
6687 j = 0;
6689 while (nlups > 0)
6691 /* bring in next word of arg */
6692 if (j < NE)
6693 num[NI - 1] = xx[j + 3];
6694 /* Do additional bit on last outer loop, for roundoff. */
6695 if (nlups <= 8)
6696 n = nlups + 1;
6697 for (i = 0; i < n; i++)
6699 /* Next 2 bits of arg */
6700 eshup1 (num);
6701 eshup1 (num);
6702 /* Shift up answer */
6703 eshup1 (sq);
6704 /* Make trial divisor */
6705 for (k = 0; k < NI; k++)
6706 temp[k] = sq[k];
6707 eshup1 (temp);
6708 eaddm (sqrndbit, temp);
6709 /* Subtract and insert answer bit if it goes in */
6710 if (ecmpm (temp, num) <= 0)
6712 esubm (temp, num);
6713 sq[NI - 2] |= 1;
6716 nlups -= n;
6717 j += 1;
6720 /* Adjust for extra, roundoff loop done. */
6721 exp += (NBITS - 1) - rndprc;
6723 /* Sticky bit = 1 if the remainder is nonzero. */
6724 k = 0;
6725 for (i = 3; i < NI; i++)
6726 k |= (int) num[i];
6728 /* Renormalize and round off. */
6729 emdnorm (sq, k, 0, exp, !ROUND_TOWARDS_ZERO);
6730 emovo (sq, y);
6732 #endif
6734 /* Return the binary precision of the significand for a given
6735 floating point mode. The mode can hold an integer value
6736 that many bits wide, without losing any bits. */
6738 unsigned int
6739 significand_size (mode)
6740 enum machine_mode mode;
6743 /* Don't test the modes, but their sizes, lest this
6744 code won't work for BITS_PER_UNIT != 8 . */
6746 switch (GET_MODE_BITSIZE (mode))
6748 case 32:
6750 #ifdef C4X
6751 return 56;
6752 #else
6753 return 24;
6754 #endif
6756 case 64:
6757 #ifdef IEEE
6758 return 53;
6759 #else
6760 return 56;
6761 #endif
6763 case 96:
6764 return 64;
6766 case 128:
6767 #if (INTEL_EXTENDED_IEEE_FORMAT == 0)
6768 return 113;
6769 #else
6770 return 64;
6771 #endif
6773 default:
6774 abort ();