|
|
1.1 root 1: /* real.c - implementation of REAL_ARITHMETIC, REAL_VALUE_ATOF, 1.1.1.3 root 2: and support for XFmode IEEE extended real floating point arithmetic. 1.1.1.4 ! root 3: Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. 1.1.1.3 root 4: Contributed by Stephen L. Moshier ([email protected]). 1.1 root 5: 6: This file is part of GNU CC. 7: 8: GNU CC is free software; you can redistribute it and/or modify 9: it under the terms of the GNU General Public License as published by 10: the Free Software Foundation; either version 2, or (at your option) 11: any later version. 12: 13: GNU CC is distributed in the hope that it will be useful, 14: but WITHOUT ANY WARRANTY; without even the implied warranty of 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16: GNU General Public License for more details. 17: 18: You should have received a copy of the GNU General Public License 19: along with GNU CC; see the file COPYING. If not, write to 1.1.1.4 ! root 20: the Free Software Foundation, 59 Temple Place - Suite 330, ! 21: Boston, MA 02111-1307, USA. */ 1.1 root 22: 23: #include <stdio.h> 24: #include <errno.h> 25: #include "config.h" 26: #include "tree.h" 27: 28: #ifndef errno 29: extern int errno; 30: #endif 31: 32: /* To enable support of XFmode extended real floating point, define 33: LONG_DOUBLE_TYPE_SIZE 96 in the tm.h file (m68k.h or i386.h). 34: 1.1.1.2 root 35: To support cross compilation between IEEE, VAX and IBM floating 1.1 root 36: point formats, define REAL_ARITHMETIC in the tm.h file. 37: 38: In either case the machine files (tm.h) must not contain any code 39: that tries to use host floating point arithmetic to convert 40: REAL_VALUE_TYPEs from `double' to `float', pass them to fprintf, 41: etc. In cross-compile situations a REAL_VALUE_TYPE may not 42: be intelligible to the host computer's native arithmetic. 43: 44: The emulator defaults to the host's floating point format so that 45: its decimal conversion functions can be used if desired (see 46: real.h). 47: 1.1.1.4 ! root 48: The first part of this file interfaces gcc to a floating point ! 49: arithmetic suite that was not written with gcc in mind. Avoid ! 50: changing the low-level arithmetic routines unless you have suitable ! 51: test programs available. A special version of the PARANOIA floating ! 52: point arithmetic tester, modified for this purpose, can be found on ! 53: usc.edu: /pub/C-numanal/ieeetest.zoo. Other tests, and libraries of ! 54: XFmode and TFmode transcendental functions, can be obtained by ftp from ! 55: netlib.att.com: netlib/cephes. */ 1.1.1.2 root 56: 1.1 root 57: /* Type of computer arithmetic. 1.1.1.4 ! root 58: Only one of DEC, IBM, IEEE, or UNK should get defined. 1.1 root 59: 1.1.1.4 ! root 60: `IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically ! 61: to big-endian IEEE floating-point data structure. This definition ! 62: should work in SFmode `float' type and DFmode `double' type on ! 63: virtually all big-endian IEEE machines. If LONG_DOUBLE_TYPE_SIZE ! 64: has been defined to be 96, then IEEE also invokes the particular ! 65: XFmode (`long double' type) data structure used by the Motorola ! 66: 680x0 series processors. ! 67: ! 68: `IEEE', when REAL_WORDS_BIG_ENDIAN is zero, refers generally to ! 69: little-endian IEEE machines. In this case, if LONG_DOUBLE_TYPE_SIZE ! 70: has been defined to be 96, then IEEE also invokes the particular ! 71: XFmode `long double' data structure used by the Intel 80x86 series ! 72: processors. 1.1 root 73: 74: `DEC' refers specifically to the Digital Equipment Corp PDP-11 75: and VAX floating point data structure. This model currently 76: supports no type wider than DFmode. 77: 1.1.1.2 root 78: `IBM' refers specifically to the IBM System/370 and compatible 79: floating point data structure. This model currently supports 80: no type wider than DFmode. The IBM conversions were contributed by 81: [email protected] (Frank Crawford). 82: 1.1 root 83: If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it) 84: then `long double' and `double' are both implemented, but they 85: both mean DFmode. In this case, the software floating-point 86: support available here is activated by writing 87: #define REAL_ARITHMETIC 88: in tm.h. 89: 90: The case LONG_DOUBLE_TYPE_SIZE = 128 activates TFmode support 1.1.1.2 root 91: and may deactivate XFmode since `long double' is used to refer 92: to both modes. 93: 94: The macros FLOAT_WORDS_BIG_ENDIAN, HOST_FLOAT_WORDS_BIG_ENDIAN, 95: contributed by Richard Earnshaw <[email protected]>, 96: separate the floating point unit's endian-ness from that of 97: the integer addressing. This permits one to define a big-endian 98: FPU on a little-endian machine (e.g., ARM). An extension to 99: BYTES_BIG_ENDIAN may be required for some machines in the future. 100: These optional macros may be defined in tm.h. In real.h, they 101: default to WORDS_BIG_ENDIAN, etc., so there is no need to define 102: them for any normal host or target machine on which the floats 103: and the integers have the same endian-ness. */ 104: 1.1 root 105: 106: /* The following converts gcc macros into the ones used by this file. */ 107: 108: /* REAL_ARITHMETIC defined means that macros in real.h are 109: defined to call emulator functions. */ 110: #ifdef REAL_ARITHMETIC 111: 112: #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT 113: /* PDP-11, Pro350, VAX: */ 114: #define DEC 1 115: #else /* it's not VAX */ 1.1.1.2 root 116: #if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT 117: /* IBM System/370 style */ 118: #define IBM 1 119: #else /* it's also not an IBM */ 1.1 root 120: #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT 1.1.1.4 ! root 121: #define IEEE 1.1 root 122: #else /* it's not IEEE either */ 123: /* UNKnown arithmetic. We don't support this and can't go on. */ 124: unknown arithmetic type 125: #define UNK 1 126: #endif /* not IEEE */ 1.1.1.2 root 127: #endif /* not IBM */ 1.1 root 128: #endif /* not VAX */ 129: 1.1.1.4 ! root 130: #define REAL_WORDS_BIG_ENDIAN FLOAT_WORDS_BIG_ENDIAN ! 131: 1.1 root 132: #else 133: /* REAL_ARITHMETIC not defined means that the *host's* data 134: structure will be used. It may differ by endian-ness from the 135: target machine's structure and will get its ends swapped 136: accordingly (but not here). Probably only the decimal <-> binary 137: functions in this file will actually be used in this case. */ 1.1.1.3 root 138: 1.1 root 139: #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT 140: #define DEC 1 141: #else /* it's not VAX */ 1.1.1.2 root 142: #if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT 143: /* IBM System/370 style */ 144: #define IBM 1 145: #else /* it's also not an IBM */ 1.1 root 146: #if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT 1.1.1.4 ! root 147: #define IEEE 1.1 root 148: #else /* it's not IEEE either */ 149: unknown arithmetic type 150: #define UNK 1 151: #endif /* not IEEE */ 1.1.1.2 root 152: #endif /* not IBM */ 1.1 root 153: #endif /* not VAX */ 154: 1.1.1.4 ! root 155: #define REAL_WORDS_BIG_ENDIAN HOST_FLOAT_WORDS_BIG_ENDIAN ! 156: 1.1 root 157: #endif /* REAL_ARITHMETIC not defined */ 158: 159: /* Define INFINITY for support of infinity. 160: Define NANS for support of Not-a-Number's (NaN's). */ 1.1.1.2 root 161: #if !defined(DEC) && !defined(IBM) 1.1 root 162: #define INFINITY 163: #define NANS 164: #endif 165: 166: /* Support of NaNs requires support of infinity. */ 167: #ifdef NANS 168: #ifndef INFINITY 169: #define INFINITY 170: #endif 171: #endif 1.1.1.2 root 172: 1.1 root 173: /* Find a host integer type that is at least 16 bits wide, 174: and another type at least twice whatever that size is. */ 175: 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: /* You will have to modify this program to have a smaller unit size. */ 197: #define EMU_NON_COMPILE 198: #endif 199: #endif 200: #endif 201: #endif 202: 203: #if HOST_BITS_PER_SHORT >= EMULONG_SIZE 204: #define EMULONG short 205: #else 206: #if HOST_BITS_PER_INT >= EMULONG_SIZE 207: #define EMULONG int 208: #else 209: #if HOST_BITS_PER_LONG >= EMULONG_SIZE 210: #define EMULONG long 211: #else 212: #if HOST_BITS_PER_LONG_LONG >= EMULONG_SIZE 213: #define EMULONG long long int 214: #else 215: /* You will have to modify this program to have a smaller unit size. */ 216: #define EMU_NON_COMPILE 217: #endif 218: #endif 219: #endif 220: #endif 221: 222: 223: /* The host interface doesn't work if no 16-bit size exists. */ 224: #if EMUSHORT_SIZE != 16 225: #define EMU_NON_COMPILE 226: #endif 227: 228: /* OK to continue compilation. */ 229: #ifndef EMU_NON_COMPILE 230: 231: /* Construct macros to translate between REAL_VALUE_TYPE and e type. 232: In GET_REAL and PUT_REAL, r and e are pointers. 233: A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations 234: in memory, with no holes. */ 235: 236: #if LONG_DOUBLE_TYPE_SIZE == 96 1.1.1.2 root 237: /* Number of 16 bit words in external e type format */ 238: #define NE 6 239: #define MAXDECEXP 4932 240: #define MINDECEXP -4956 1.1.1.3 root 241: #define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE) 242: #define PUT_REAL(e,r) bcopy ((char *) e, (char *) r, 2*NE) 1.1 root 243: #else /* no XFmode */ 1.1.1.2 root 244: #if LONG_DOUBLE_TYPE_SIZE == 128 245: #define NE 10 246: #define MAXDECEXP 4932 247: #define MINDECEXP -4977 1.1.1.3 root 248: #define GET_REAL(r,e) bcopy ((char *) r, (char *) e, 2*NE) 249: #define PUT_REAL(e,r) bcopy ((char *) e, (char *) r, 2*NE) 1.1.1.2 root 250: #else 251: #define NE 6 252: #define MAXDECEXP 4932 253: #define MINDECEXP -4956 1.1 root 254: #ifdef REAL_ARITHMETIC 255: /* Emulator uses target format internally 256: but host stores it in host endian-ness. */ 257: 1.1.1.4 ! root 258: #define GET_REAL(r,e) \ ! 259: do { \ ! 260: if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \ ! 261: e53toe ((unsigned EMUSHORT*) (r), (e)); \ ! 262: else \ ! 263: { \ ! 264: unsigned EMUSHORT w[4]; \ ! 265: w[3] = ((EMUSHORT *) r)[0]; \ ! 266: w[2] = ((EMUSHORT *) r)[1]; \ ! 267: w[1] = ((EMUSHORT *) r)[2]; \ ! 268: w[0] = ((EMUSHORT *) r)[3]; \ ! 269: e53toe (w, (e)); \ ! 270: } \ ! 271: } while (0) ! 272: ! 273: #define PUT_REAL(e,r) \ ! 274: do { \ ! 275: if (HOST_FLOAT_WORDS_BIG_ENDIAN == REAL_WORDS_BIG_ENDIAN) \ ! 276: etoe53 ((e), (unsigned EMUSHORT *) (r)); \ ! 277: else \ ! 278: { \ ! 279: unsigned EMUSHORT w[4]; \ ! 280: etoe53 ((e), w); \ ! 281: *((EMUSHORT *) r) = w[3]; \ ! 282: *((EMUSHORT *) r + 1) = w[2]; \ ! 283: *((EMUSHORT *) r + 2) = w[1]; \ ! 284: *((EMUSHORT *) r + 3) = w[0]; \ ! 285: } \ ! 286: } while (0) 1.1 root 287: 288: #else /* not REAL_ARITHMETIC */ 289: 290: /* emulator uses host format */ 1.1.1.3 root 291: #define GET_REAL(r,e) e53toe ((unsigned EMUSHORT *) (r), (e)) 292: #define PUT_REAL(e,r) etoe53 ((e), (unsigned EMUSHORT *) (r)) 1.1 root 293: 294: #endif /* not REAL_ARITHMETIC */ 1.1.1.2 root 295: #endif /* not TFmode */ 1.1 root 296: #endif /* no XFmode */ 297: 1.1.1.2 root 298: 299: /* Number of 16 bit words in internal format */ 300: #define NI (NE+3) 301: 302: /* Array offset to exponent */ 303: #define E 1 304: 305: /* Array offset to high guard word */ 306: #define M 2 307: 308: /* Number of bits of precision */ 309: #define NBITS ((NI-4)*16) 310: 311: /* Maximum number of decimal digits in ASCII conversion 312: * = NBITS*log10(2) 313: */ 314: #define NDEC (NBITS*8/27) 315: 316: /* The exponent of 1.0 */ 317: #define EXONE (0x3fff) 318: 1.1 root 319: extern int extra_warnings; 320: extern unsigned EMUSHORT ezero[], ehalf[], eone[], etwo[]; 321: extern unsigned EMUSHORT elog2[], esqrt2[]; 1.1.1.3 root 322: 323: static void endian PROTO((unsigned EMUSHORT *, long *, 324: enum machine_mode)); 325: static void eclear PROTO((unsigned EMUSHORT *)); 326: static void emov PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 327: static void eabs PROTO((unsigned EMUSHORT *)); 328: static void eneg PROTO((unsigned EMUSHORT *)); 329: static int eisneg PROTO((unsigned EMUSHORT *)); 330: static int eisinf PROTO((unsigned EMUSHORT *)); 331: static int eisnan PROTO((unsigned EMUSHORT *)); 332: static void einfin PROTO((unsigned EMUSHORT *)); 333: static void enan PROTO((unsigned EMUSHORT *, int)); 334: static void emovi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 335: static void emovo PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 336: static void ecleaz PROTO((unsigned EMUSHORT *)); 337: static void ecleazs PROTO((unsigned EMUSHORT *)); 338: static void emovz PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 339: static void einan PROTO((unsigned EMUSHORT *)); 340: static int eiisnan PROTO((unsigned EMUSHORT *)); 341: static int eiisneg PROTO((unsigned EMUSHORT *)); 342: static void eiinfin PROTO((unsigned EMUSHORT *)); 343: static int eiisinf PROTO((unsigned EMUSHORT *)); 344: static int ecmpm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 345: static void eshdn1 PROTO((unsigned EMUSHORT *)); 346: static void eshup1 PROTO((unsigned EMUSHORT *)); 347: static void eshdn8 PROTO((unsigned EMUSHORT *)); 348: static void eshup8 PROTO((unsigned EMUSHORT *)); 349: static void eshup6 PROTO((unsigned EMUSHORT *)); 350: static void eshdn6 PROTO((unsigned EMUSHORT *)); 351: static void eaddm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 352: static void esubm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 353: static void m16m PROTO((unsigned int, unsigned short *, 354: unsigned short *)); 355: static int edivm PROTO((unsigned short *, unsigned short *)); 356: static int emulm PROTO((unsigned short *, unsigned short *)); 357: static void emdnorm PROTO((unsigned EMUSHORT *, int, int, EMULONG, int)); 358: static void esub PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 359: unsigned EMUSHORT *)); 360: static void eadd PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 361: unsigned EMUSHORT *)); 362: static void eadd1 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 363: unsigned EMUSHORT *)); 364: static void ediv PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 365: unsigned EMUSHORT *)); 366: static void emul PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 367: unsigned EMUSHORT *)); 368: static void e53toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 369: static void e64toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 370: static void e113toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 371: static void e24toe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 372: static void etoe113 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 373: static void toe113 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 374: static void etoe64 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 375: static void toe64 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 376: static void etoe53 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 377: static void toe53 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 378: static void etoe24 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 379: static void toe24 PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 380: static int ecmp PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 381: static void eround PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 382: static void ltoe PROTO((HOST_WIDE_INT *, unsigned EMUSHORT *)); 383: static void ultoe PROTO((unsigned HOST_WIDE_INT *, unsigned EMUSHORT *)); 384: static void eifrac PROTO((unsigned EMUSHORT *, HOST_WIDE_INT *, 385: unsigned EMUSHORT *)); 386: static void euifrac PROTO((unsigned EMUSHORT *, unsigned HOST_WIDE_INT *, 387: unsigned EMUSHORT *)); 388: static int eshift PROTO((unsigned EMUSHORT *, int)); 389: static int enormlz PROTO((unsigned EMUSHORT *)); 390: static void e24toasc PROTO((unsigned EMUSHORT *, char *, int)); 391: static void e53toasc PROTO((unsigned EMUSHORT *, char *, int)); 392: static void e64toasc PROTO((unsigned EMUSHORT *, char *, int)); 393: static void e113toasc PROTO((unsigned EMUSHORT *, char *, int)); 394: static void etoasc PROTO((unsigned EMUSHORT *, char *, int)); 395: static void asctoe24 PROTO((char *, unsigned EMUSHORT *)); 396: static void asctoe53 PROTO((char *, unsigned EMUSHORT *)); 397: static void asctoe64 PROTO((char *, unsigned EMUSHORT *)); 398: static void asctoe113 PROTO((char *, unsigned EMUSHORT *)); 399: static void asctoe PROTO((char *, unsigned EMUSHORT *)); 400: static void asctoeg PROTO((char *, unsigned EMUSHORT *, int)); 401: static void efloor PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 402: static void efrexp PROTO((unsigned EMUSHORT *, int *, 403: unsigned EMUSHORT *)); 404: static void eldexp PROTO((unsigned EMUSHORT *, int, unsigned EMUSHORT *)); 405: static void eremain PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 406: unsigned EMUSHORT *)); 407: static void eiremain PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 408: static void mtherr PROTO((char *, int)); 409: static void dectoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 410: static void etodec PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 411: static void todec PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 412: static void ibmtoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 413: enum machine_mode)); 414: static void etoibm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 415: enum machine_mode)); 416: static void toibm PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *, 417: enum machine_mode)); 418: static void make_nan PROTO((unsigned EMUSHORT *, int, enum machine_mode)); 419: static void uditoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 420: static void ditoe PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 421: static void etoudi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 422: static void etodi PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 423: static void esqrt PROTO((unsigned EMUSHORT *, unsigned EMUSHORT *)); 1.1.1.2 root 424: 425: /* Copy 32-bit numbers obtained from array containing 16-bit numbers, 426: swapping ends if required, into output array of longs. The 427: result is normally passed to fprintf by the ASM_OUTPUT_ macros. */ 1.1.1.3 root 428: 429: static void 1.1 root 430: endian (e, x, mode) 431: unsigned EMUSHORT e[]; 432: long x[]; 433: enum machine_mode mode; 434: { 435: unsigned long th, t; 436: 1.1.1.4 ! root 437: if (REAL_WORDS_BIG_ENDIAN) 1.1 root 438: { 1.1.1.4 ! root 439: switch (mode) ! 440: { 1.1 root 441: 1.1.1.4 ! root 442: case TFmode: ! 443: /* Swap halfwords in the fourth long. */ ! 444: th = (unsigned long) e[6] & 0xffff; ! 445: t = (unsigned long) e[7] & 0xffff; ! 446: t |= th << 16; ! 447: x[3] = (long) t; ! 448: ! 449: case XFmode: ! 450: ! 451: /* Swap halfwords in the third long. */ ! 452: th = (unsigned long) e[4] & 0xffff; ! 453: t = (unsigned long) e[5] & 0xffff; ! 454: t |= th << 16; ! 455: x[2] = (long) t; ! 456: /* fall into the double case */ ! 457: ! 458: case DFmode: ! 459: ! 460: /* swap halfwords in the second word */ ! 461: th = (unsigned long) e[2] & 0xffff; ! 462: t = (unsigned long) e[3] & 0xffff; ! 463: t |= th << 16; ! 464: x[1] = (long) t; ! 465: /* fall into the float case */ ! 466: ! 467: case HFmode: ! 468: case SFmode: ! 469: ! 470: /* swap halfwords in the first word */ ! 471: th = (unsigned long) e[0] & 0xffff; ! 472: t = (unsigned long) e[1] & 0xffff; ! 473: t |= th << 16; ! 474: x[0] = t; ! 475: break; 1.1 root 476: 1.1.1.4 ! root 477: default: ! 478: abort (); ! 479: } 1.1 root 480: } 1.1.1.4 ! root 481: else 1.1 root 482: { 1.1.1.4 ! root 483: /* Pack the output array without swapping. */ 1.1 root 484: 1.1.1.4 ! root 485: switch (mode) ! 486: { 1.1 root 487: 1.1.1.4 ! root 488: case TFmode: 1.1 root 489: 1.1.1.4 ! root 490: /* Pack the fourth long. */ ! 491: th = (unsigned long) e[7] & 0xffff; ! 492: t = (unsigned long) e[6] & 0xffff; ! 493: t |= th << 16; ! 494: x[3] = (long) t; ! 495: ! 496: case XFmode: ! 497: ! 498: /* Pack the third long. ! 499: Each element of the input REAL_VALUE_TYPE array has 16 useful bits ! 500: in it. */ ! 501: th = (unsigned long) e[5] & 0xffff; ! 502: t = (unsigned long) e[4] & 0xffff; ! 503: t |= th << 16; ! 504: x[2] = (long) t; ! 505: /* fall into the double case */ ! 506: ! 507: case DFmode: ! 508: ! 509: /* pack the second long */ ! 510: th = (unsigned long) e[3] & 0xffff; ! 511: t = (unsigned long) e[2] & 0xffff; ! 512: t |= th << 16; ! 513: x[1] = (long) t; ! 514: /* fall into the float case */ ! 515: ! 516: case HFmode: ! 517: case SFmode: ! 518: ! 519: /* pack the first long */ ! 520: th = (unsigned long) e[1] & 0xffff; ! 521: t = (unsigned long) e[0] & 0xffff; ! 522: t |= th << 16; ! 523: x[0] = t; ! 524: break; 1.1 root 525: 1.1.1.4 ! root 526: default: ! 527: abort (); ! 528: } 1.1 root 529: } 530: } 531: 532: 1.1.1.3 root 533: /* This is the implementation of the REAL_ARITHMETIC macro. */ 534: 1.1 root 535: void 536: earith (value, icode, r1, r2) 537: REAL_VALUE_TYPE *value; 538: int icode; 539: REAL_VALUE_TYPE *r1; 540: REAL_VALUE_TYPE *r2; 541: { 542: unsigned EMUSHORT d1[NE], d2[NE], v[NE]; 543: enum tree_code code; 544: 545: GET_REAL (r1, d1); 546: GET_REAL (r2, d2); 547: #ifdef NANS 548: /* Return NaN input back to the caller. */ 549: if (eisnan (d1)) 550: { 551: PUT_REAL (d1, value); 552: return; 553: } 554: if (eisnan (d2)) 555: { 556: PUT_REAL (d2, value); 557: return; 558: } 559: #endif 560: code = (enum tree_code) icode; 561: switch (code) 562: { 563: case PLUS_EXPR: 564: eadd (d2, d1, v); 565: break; 566: 567: case MINUS_EXPR: 568: esub (d2, d1, v); /* d1 - d2 */ 569: break; 570: 571: case MULT_EXPR: 572: emul (d2, d1, v); 573: break; 574: 575: case RDIV_EXPR: 576: #ifndef REAL_INFINITY 577: if (ecmp (d2, ezero) == 0) 578: { 579: #ifdef NANS 1.1.1.3 root 580: enan (v, eisneg (d1) ^ eisneg (d2)); 1.1 root 581: break; 582: #else 583: abort (); 584: #endif 585: } 586: #endif 587: ediv (d2, d1, v); /* d1/d2 */ 588: break; 589: 590: case MIN_EXPR: /* min (d1,d2) */ 591: if (ecmp (d1, d2) < 0) 592: emov (d1, v); 593: else 594: emov (d2, v); 595: break; 596: 597: case MAX_EXPR: /* max (d1,d2) */ 598: if (ecmp (d1, d2) > 0) 599: emov (d1, v); 600: else 601: emov (d2, v); 602: break; 603: default: 604: emov (ezero, v); 605: break; 606: } 607: PUT_REAL (v, value); 608: } 609: 610: 1.1.1.3 root 611: /* Truncate REAL_VALUE_TYPE toward zero to signed HOST_WIDE_INT. 612: implements REAL_VALUE_RNDZINT (x) (etrunci (x)). */ 613: 1.1 root 614: REAL_VALUE_TYPE 615: etrunci (x) 616: REAL_VALUE_TYPE x; 617: { 618: unsigned EMUSHORT f[NE], g[NE]; 619: REAL_VALUE_TYPE r; 1.1.1.2 root 620: HOST_WIDE_INT l; 1.1 root 621: 622: GET_REAL (&x, g); 623: #ifdef NANS 624: if (eisnan (g)) 625: return (x); 626: #endif 627: eifrac (g, &l, f); 628: ltoe (&l, g); 629: PUT_REAL (g, &r); 630: return (r); 631: } 632: 633: 1.1.1.3 root 634: /* Truncate REAL_VALUE_TYPE toward zero to unsigned HOST_WIDE_INT; 635: implements REAL_VALUE_UNSIGNED_RNDZINT (x) (etruncui (x)). */ 636: 1.1 root 637: REAL_VALUE_TYPE 638: etruncui (x) 639: REAL_VALUE_TYPE x; 640: { 641: unsigned EMUSHORT f[NE], g[NE]; 642: REAL_VALUE_TYPE r; 1.1.1.2 root 643: unsigned HOST_WIDE_INT l; 1.1 root 644: 645: GET_REAL (&x, g); 646: #ifdef NANS 647: if (eisnan (g)) 648: return (x); 649: #endif 650: euifrac (g, &l, f); 651: ultoe (&l, g); 652: PUT_REAL (g, &r); 653: return (r); 654: } 655: 656: 1.1.1.3 root 657: /* This is the REAL_VALUE_ATOF function. It converts a decimal string to 658: binary, rounding off as indicated by the machine_mode argument. Then it 659: promotes the rounded value to REAL_VALUE_TYPE. */ 660: 1.1 root 661: REAL_VALUE_TYPE 662: ereal_atof (s, t) 663: char *s; 664: enum machine_mode t; 665: { 666: unsigned EMUSHORT tem[NE], e[NE]; 667: REAL_VALUE_TYPE r; 668: 669: switch (t) 670: { 1.1.1.3 root 671: case HFmode: 1.1 root 672: case SFmode: 673: asctoe24 (s, tem); 674: e24toe (tem, e); 675: break; 676: case DFmode: 677: asctoe53 (s, tem); 678: e53toe (tem, e); 679: break; 680: case XFmode: 681: asctoe64 (s, tem); 682: e64toe (tem, e); 683: break; 1.1.1.2 root 684: case TFmode: 685: asctoe113 (s, tem); 686: e113toe (tem, e); 687: break; 1.1 root 688: default: 689: asctoe (s, e); 690: } 691: PUT_REAL (e, &r); 692: return (r); 693: } 694: 695: 1.1.1.3 root 696: /* Expansion of REAL_NEGATE. */ 697: 1.1 root 698: REAL_VALUE_TYPE 699: ereal_negate (x) 700: REAL_VALUE_TYPE x; 701: { 702: unsigned EMUSHORT e[NE]; 703: REAL_VALUE_TYPE r; 704: 705: GET_REAL (&x, e); 706: eneg (e); 707: PUT_REAL (e, &r); 708: return (r); 709: } 710: 711: 1.1.1.3 root 712: /* Round real toward zero to HOST_WIDE_INT; 713: implements REAL_VALUE_FIX (x). */ 714: 1.1.1.2 root 715: HOST_WIDE_INT 716: efixi (x) 1.1 root 717: REAL_VALUE_TYPE x; 718: { 719: unsigned EMUSHORT f[NE], g[NE]; 1.1.1.2 root 720: HOST_WIDE_INT l; 1.1 root 721: 722: GET_REAL (&x, f); 723: #ifdef NANS 724: if (eisnan (f)) 725: { 726: warning ("conversion from NaN to int"); 727: return (-1); 728: } 729: #endif 1.1.1.2 root 730: eifrac (f, &l, g); 731: return l; 1.1 root 732: } 733: 1.1.1.2 root 734: /* Round real toward zero to unsigned HOST_WIDE_INT 1.1.1.3 root 735: implements REAL_VALUE_UNSIGNED_FIX (x). 736: Negative input returns zero. */ 737: 1.1.1.2 root 738: unsigned HOST_WIDE_INT 739: efixui (x) 1.1 root 740: REAL_VALUE_TYPE x; 741: { 742: unsigned EMUSHORT f[NE], g[NE]; 1.1.1.2 root 743: unsigned HOST_WIDE_INT l; 1.1 root 744: 745: GET_REAL (&x, f); 746: #ifdef NANS 747: if (eisnan (f)) 748: { 749: warning ("conversion from NaN to unsigned int"); 750: return (-1); 751: } 752: #endif 1.1.1.2 root 753: euifrac (f, &l, g); 754: return l; 1.1 root 755: } 756: 757: 1.1.1.3 root 758: /* REAL_VALUE_FROM_INT macro. */ 759: 1.1 root 760: void 761: ereal_from_int (d, i, j) 762: REAL_VALUE_TYPE *d; 1.1.1.2 root 763: HOST_WIDE_INT i, j; 1.1 root 764: { 765: unsigned EMUSHORT df[NE], dg[NE]; 1.1.1.2 root 766: HOST_WIDE_INT low, high; 1.1 root 767: int sign; 768: 769: sign = 0; 770: low = i; 771: if ((high = j) < 0) 772: { 773: sign = 1; 774: /* complement and add 1 */ 775: high = ~high; 776: if (low) 777: low = -low; 778: else 779: high += 1; 780: } 1.1.1.2 root 781: eldexp (eone, HOST_BITS_PER_WIDE_INT, df); 1.1.1.3 root 782: ultoe ((unsigned HOST_WIDE_INT *) &high, dg); 1.1 root 783: emul (dg, df, dg); 1.1.1.3 root 784: ultoe ((unsigned HOST_WIDE_INT *) &low, df); 1.1 root 785: eadd (df, dg, dg); 786: if (sign) 787: eneg (dg); 788: PUT_REAL (dg, d); 789: } 790: 791: 1.1.1.3 root 792: /* REAL_VALUE_FROM_UNSIGNED_INT macro. */ 793: 1.1 root 794: void 795: ereal_from_uint (d, i, j) 796: REAL_VALUE_TYPE *d; 1.1.1.2 root 797: unsigned HOST_WIDE_INT i, j; 1.1 root 798: { 799: unsigned EMUSHORT df[NE], dg[NE]; 1.1.1.2 root 800: unsigned HOST_WIDE_INT low, high; 1.1 root 801: 802: low = i; 803: high = j; 1.1.1.2 root 804: eldexp (eone, HOST_BITS_PER_WIDE_INT, df); 1.1 root 805: ultoe (&high, dg); 806: emul (dg, df, dg); 807: ultoe (&low, df); 808: eadd (df, dg, dg); 809: PUT_REAL (dg, d); 810: } 811: 812: 1.1.1.3 root 813: /* REAL_VALUE_TO_INT macro. */ 814: 1.1 root 815: void 816: ereal_to_int (low, high, rr) 1.1.1.2 root 817: HOST_WIDE_INT *low, *high; 1.1 root 818: REAL_VALUE_TYPE rr; 819: { 820: unsigned EMUSHORT d[NE], df[NE], dg[NE], dh[NE]; 821: int s; 822: 823: GET_REAL (&rr, d); 824: #ifdef NANS 825: if (eisnan (d)) 826: { 827: warning ("conversion from NaN to int"); 828: *low = -1; 829: *high = -1; 830: return; 831: } 832: #endif 833: /* convert positive value */ 834: s = 0; 835: if (eisneg (d)) 836: { 837: eneg (d); 838: s = 1; 839: } 1.1.1.2 root 840: eldexp (eone, HOST_BITS_PER_WIDE_INT, df); 1.1 root 841: ediv (df, d, dg); /* dg = d / 2^32 is the high word */ 1.1.1.3 root 842: euifrac (dg, (unsigned HOST_WIDE_INT *) high, dh); 1.1 root 843: emul (df, dh, dg); /* fractional part is the low word */ 1.1.1.3 root 844: euifrac (dg, (unsigned HOST_WIDE_INT *)low, dh); 1.1 root 845: if (s) 846: { 847: /* complement and add 1 */ 848: *high = ~(*high); 849: if (*low) 850: *low = -(*low); 851: else 852: *high += 1; 853: } 854: } 855: 856: 1.1.1.3 root 857: /* REAL_VALUE_LDEXP macro. */ 858: 1.1 root 859: REAL_VALUE_TYPE 860: ereal_ldexp (x, n) 861: REAL_VALUE_TYPE x; 862: int n; 863: { 864: unsigned EMUSHORT e[NE], y[NE]; 865: REAL_VALUE_TYPE r; 866: 867: GET_REAL (&x, e); 868: #ifdef NANS 869: if (eisnan (e)) 870: return (x); 871: #endif 872: eldexp (e, n, y); 873: PUT_REAL (y, &r); 874: return (r); 875: } 876: 877: /* These routines are conditionally compiled because functions 1.1.1.3 root 878: of the same names may be defined in fold-const.c. */ 879: 1.1 root 880: #ifdef REAL_ARITHMETIC 881: 882: /* Check for infinity in a REAL_VALUE_TYPE. */ 1.1.1.3 root 883: 1.1 root 884: int 885: target_isinf (x) 886: REAL_VALUE_TYPE x; 887: { 888: unsigned EMUSHORT e[NE]; 889: 890: #ifdef INFINITY 891: GET_REAL (&x, e); 892: return (eisinf (e)); 893: #else 894: return 0; 895: #endif 896: } 897: 898: /* Check whether a REAL_VALUE_TYPE item is a NaN. */ 899: 900: int 901: target_isnan (x) 902: REAL_VALUE_TYPE x; 903: { 904: unsigned EMUSHORT e[NE]; 905: 906: #ifdef NANS 907: GET_REAL (&x, e); 908: return (eisnan (e)); 909: #else 910: return (0); 911: #endif 912: } 913: 914: 915: /* Check for a negative REAL_VALUE_TYPE number. 1.1.1.3 root 916: This just checks the sign bit, so that -0 counts as negative. */ 1.1 root 917: 918: int 919: target_negative (x) 920: REAL_VALUE_TYPE x; 921: { 1.1.1.3 root 922: return ereal_isneg (x); 1.1 root 923: } 924: 925: /* Expansion of REAL_VALUE_TRUNCATE. 1.1.1.3 root 926: The result is in floating point, rounded to nearest or even. */ 927: 1.1 root 928: REAL_VALUE_TYPE 929: real_value_truncate (mode, arg) 930: enum machine_mode mode; 931: REAL_VALUE_TYPE arg; 932: { 933: unsigned EMUSHORT e[NE], t[NE]; 934: REAL_VALUE_TYPE r; 935: 936: GET_REAL (&arg, e); 937: #ifdef NANS 938: if (eisnan (e)) 939: return (arg); 940: #endif 941: eclear (t); 942: switch (mode) 943: { 1.1.1.2 root 944: case TFmode: 945: etoe113 (e, t); 946: e113toe (t, t); 947: break; 948: 1.1 root 949: case XFmode: 950: etoe64 (e, t); 951: e64toe (t, t); 952: break; 953: 954: case DFmode: 955: etoe53 (e, t); 956: e53toe (t, t); 957: break; 958: 1.1.1.3 root 959: case HFmode: 1.1 root 960: case SFmode: 961: etoe24 (e, t); 962: e24toe (t, t); 963: break; 964: 965: case SImode: 1.1.1.2 root 966: r = etrunci (arg); 1.1 root 967: return (r); 968: 1.1.1.3 root 969: /* If an unsupported type was requested, presume that 970: the machine files know something useful to do with 971: the unmodified value. */ 972: 1.1 root 973: default: 1.1.1.3 root 974: return (arg); 1.1 root 975: } 976: PUT_REAL (t, &r); 977: return (r); 978: } 979: 980: #endif /* REAL_ARITHMETIC defined */ 981: 1.1.1.2 root 982: /* Used for debugging--print the value of R in human-readable format 983: on stderr. */ 984: 985: void 986: debug_real (r) 987: REAL_VALUE_TYPE r; 988: { 989: char dstr[30]; 990: 991: REAL_VALUE_TO_DECIMAL (r, "%.20g", dstr); 992: fprintf (stderr, "%s", dstr); 993: } 994: 995: 1.1.1.4 ! root 996: /* The following routines convert REAL_VALUE_TYPE to the various floating ! 997: point formats that are meaningful to supported computers. ! 998: ! 999: The results are returned in 32-bit pieces, each piece stored in a `long'. ! 1000: This is so they can be printed by statements like ! 1001: ! 1002: fprintf (file, "%lx, %lx", L[0], L[1]); ! 1003: ! 1004: that will work on both narrow- and wide-word host computers. */ 1.1.1.2 root 1005: 1.1.1.4 ! root 1006: /* Convert R to a 128-bit long double precision value. The output array L ! 1007: contains four 32-bit pieces of the result, in the order they would appear ! 1008: in memory. */ 1.1.1.3 root 1009: 1.1.1.2 root 1010: void 1011: etartdouble (r, l) 1012: REAL_VALUE_TYPE r; 1013: long l[]; 1014: { 1015: unsigned EMUSHORT e[NE]; 1016: 1017: GET_REAL (&r, e); 1018: etoe113 (e, e); 1019: endian (e, l, TFmode); 1020: } 1021: 1.1.1.4 ! root 1022: /* Convert R to a double extended precision value. The output array L ! 1023: contains three 32-bit pieces of the result, in the order they would ! 1024: appear in memory. */ 1.1.1.3 root 1025: 1.1 root 1026: void 1027: etarldouble (r, l) 1028: REAL_VALUE_TYPE r; 1029: long l[]; 1030: { 1031: unsigned EMUSHORT e[NE]; 1032: 1033: GET_REAL (&r, e); 1034: etoe64 (e, e); 1035: endian (e, l, XFmode); 1036: } 1037: 1.1.1.4 ! root 1038: /* Convert R to a double precision value. The output array L contains two ! 1039: 32-bit pieces of the result, in the order they would appear in memory. */ ! 1040: 1.1 root 1041: void 1042: etardouble (r, l) 1043: REAL_VALUE_TYPE r; 1044: long l[]; 1045: { 1046: unsigned EMUSHORT e[NE]; 1047: 1048: GET_REAL (&r, e); 1049: etoe53 (e, e); 1050: endian (e, l, DFmode); 1051: } 1052: 1.1.1.4 ! root 1053: /* Convert R to a single precision float value stored in the least-significant ! 1054: bits of a `long'. */ ! 1055: 1.1 root 1056: long 1057: etarsingle (r) 1058: REAL_VALUE_TYPE r; 1059: { 1060: unsigned EMUSHORT e[NE]; 1.1.1.3 root 1061: long l; 1.1 root 1062: 1063: GET_REAL (&r, e); 1064: etoe24 (e, e); 1065: endian (e, &l, SFmode); 1066: return ((long) l); 1067: } 1068: 1.1.1.4 ! root 1069: /* Convert X to a decimal ASCII string S for output to an assembly ! 1070: language file. Note, there is no standard way to spell infinity or ! 1071: a NaN, so these values may require special treatment in the tm.h ! 1072: macros. */ ! 1073: 1.1 root 1074: void 1075: ereal_to_decimal (x, s) 1076: REAL_VALUE_TYPE x; 1077: char *s; 1078: { 1079: unsigned EMUSHORT e[NE]; 1080: 1081: GET_REAL (&x, e); 1082: etoasc (e, s, 20); 1083: } 1084: 1.1.1.4 ! root 1085: /* Compare X and Y. Return 1 if X > Y, 0 if X == Y, -1 if X < Y, ! 1086: or -2 if either is a NaN. */ ! 1087: 1.1 root 1088: int 1089: ereal_cmp (x, y) 1090: REAL_VALUE_TYPE x, y; 1091: { 1092: unsigned EMUSHORT ex[NE], ey[NE]; 1093: 1094: GET_REAL (&x, ex); 1095: GET_REAL (&y, ey); 1096: return (ecmp (ex, ey)); 1097: } 1098: 1.1.1.4 ! root 1099: /* Return 1 if the sign bit of X is set, else return 0. */ ! 1100: 1.1 root 1101: int 1102: ereal_isneg (x) 1103: REAL_VALUE_TYPE x; 1104: { 1105: unsigned EMUSHORT ex[NE]; 1106: 1107: GET_REAL (&x, ex); 1108: return (eisneg (ex)); 1109: } 1110: 1111: /* End of REAL_ARITHMETIC interface */ 1.1.1.2 root 1112: 1.1.1.3 root 1113: /* 1114: Extended precision IEEE binary floating point arithmetic routines 1.1 root 1115: 1.1.1.3 root 1116: Numbers are stored in C language as arrays of 16-bit unsigned 1117: short integers. The arguments of the routines are pointers to 1118: the arrays. 1119: 1.1.1.4 ! root 1120: External e type data structure, similar to Intel 8087 chip 1.1.1.3 root 1121: temporary real format but possibly with a larger significand: 1122: 1123: NE-1 significand words (least significant word first, 1124: most significant bit is normally set) 1125: exponent (value = EXONE for 1.0, 1126: top bit is the sign) 1127: 1128: 1.1.1.4 ! root 1129: Internal exploded e-type data structure of a number (a "word" is 16 bits): 1.1.1.3 root 1130: 1131: ei[0] sign word (0 for positive, 0xffff for negative) 1132: ei[1] biased exponent (value = EXONE for the number 1.0) 1133: ei[2] high guard word (always zero after normalization) 1134: ei[3] 1135: to ei[NI-2] significand (NI-4 significand words, 1136: most significant word first, 1137: most significant bit is set) 1138: ei[NI-1] low guard word (0x8000 bit is rounding place) 1139: 1140: 1141: 1.1.1.4 ! root 1142: Routines for external format e-type numbers 1.1.1.3 root 1143: 1144: asctoe (string, e) ASCII string to extended double e type 1145: asctoe64 (string, &d) ASCII string to long double 1146: asctoe53 (string, &d) ASCII string to double 1147: asctoe24 (string, &f) ASCII string to single 1148: asctoeg (string, e, prec) ASCII string to specified precision 1149: e24toe (&f, e) IEEE single precision to e type 1150: e53toe (&d, e) IEEE double precision to e type 1151: e64toe (&d, e) IEEE long double precision to e type 1152: e113toe (&d, e) 128-bit long double precision to e type 1153: eabs (e) absolute value 1154: eadd (a, b, c) c = b + a 1155: eclear (e) e = 0 1156: ecmp (a, b) Returns 1 if a > b, 0 if a == b, 1157: -1 if a < b, -2 if either a or b is a NaN. 1158: ediv (a, b, c) c = b / a 1159: efloor (a, b) truncate to integer, toward -infinity 1160: efrexp (a, exp, s) extract exponent and significand 1161: eifrac (e, &l, frac) e to HOST_WIDE_INT and e type fraction 1162: euifrac (e, &l, frac) e to unsigned HOST_WIDE_INT and e type fraction 1163: einfin (e) set e to infinity, leaving its sign alone 1164: eldexp (a, n, b) multiply by 2**n 1165: emov (a, b) b = a 1166: emul (a, b, c) c = b * a 1167: eneg (e) e = -e 1168: eround (a, b) b = nearest integer value to a 1169: esub (a, b, c) c = b - a 1170: e24toasc (&f, str, n) single to ASCII string, n digits after decimal 1171: e53toasc (&d, str, n) double to ASCII string, n digits after decimal 1172: e64toasc (&d, str, n) 80-bit long double to ASCII string 1173: e113toasc (&d, str, n) 128-bit long double to ASCII string 1174: etoasc (e, str, n) e to ASCII string, n digits after decimal 1175: etoe24 (e, &f) convert e type to IEEE single precision 1176: etoe53 (e, &d) convert e type to IEEE double precision 1177: etoe64 (e, &d) convert e type to IEEE long double precision 1178: ltoe (&l, e) HOST_WIDE_INT to e type 1179: ultoe (&l, e) unsigned HOST_WIDE_INT to e type 1180: eisneg (e) 1 if sign bit of e != 0, else 0 1181: eisinf (e) 1 if e has maximum exponent (non-IEEE) 1182: or is infinite (IEEE) 1183: eisnan (e) 1 if e is a NaN 1184: 1185: 1.1.1.4 ! root 1186: Routines for internal format exploded e-type numbers 1.1.1.3 root 1187: 1188: eaddm (ai, bi) add significands, bi = bi + ai 1189: ecleaz (ei) ei = 0 1190: ecleazs (ei) set ei = 0 but leave its sign alone 1191: ecmpm (ai, bi) compare significands, return 1, 0, or -1 1192: edivm (ai, bi) divide significands, bi = bi / ai 1193: emdnorm (ai,l,s,exp) normalize and round off 1194: emovi (a, ai) convert external a to internal ai 1195: emovo (ai, a) convert internal ai to external a 1196: emovz (ai, bi) bi = ai, low guard word of bi = 0 1197: emulm (ai, bi) multiply significands, bi = bi * ai 1198: enormlz (ei) left-justify the significand 1199: eshdn1 (ai) shift significand and guards down 1 bit 1200: eshdn8 (ai) shift down 8 bits 1201: eshdn6 (ai) shift down 16 bits 1202: eshift (ai, n) shift ai n bits up (or down if n < 0) 1203: eshup1 (ai) shift significand and guards up 1 bit 1204: eshup8 (ai) shift up 8 bits 1205: eshup6 (ai) shift up 16 bits 1206: esubm (ai, bi) subtract significands, bi = bi - ai 1207: eiisinf (ai) 1 if infinite 1208: eiisnan (ai) 1 if a NaN 1209: eiisneg (ai) 1 if sign bit of ai != 0, else 0 1210: einan (ai) set ai = NaN 1211: eiinfin (ai) set ai = infinity 1212: 1213: The result is always normalized and rounded to NI-4 word precision 1214: after each arithmetic operation. 1215: 1216: Exception flags are NOT fully supported. 1217: 1218: Signaling NaN's are NOT supported; they are treated the same 1219: as quiet NaN's. 1220: 1221: Define INFINITY for support of infinity; otherwise a 1222: saturation arithmetic is implemented. 1223: 1224: Define NANS for support of Not-a-Number items; otherwise the 1225: arithmetic will never produce a NaN output, and might be confused 1226: by a NaN input. 1227: If NaN's are supported, the output of `ecmp (a,b)' is -2 if 1228: either a or b is a NaN. This means asking `if (ecmp (a,b) < 0)' 1229: may not be legitimate. Use `if (ecmp (a,b) == -1)' for `less than' 1230: if in doubt. 1231: 1232: Denormals are always supported here where appropriate (e.g., not 1233: for conversion to DEC numbers). */ 1234: 1235: /* Definitions for error codes that are passed to the common error handling 1236: routine mtherr. 1237: 1238: For Digital Equipment PDP-11 and VAX computers, certain 1239: IBM systems, and others that use numbers with a 56-bit 1240: significand, the symbol DEC should be defined. In this 1241: mode, most floating point constants are given as arrays 1242: of octal integers to eliminate decimal to binary conversion 1243: errors that might be introduced by the compiler. 1244: 1245: For computers, such as IBM PC, that follow the IEEE 1246: Standard for Binary Floating Point Arithmetic (ANSI/IEEE 1.1.1.4 ! root 1247: Std 754-1985), the symbol IEEE should be defined. 1.1.1.3 root 1248: These numbers have 53-bit significands. In this mode, constants 1249: are provided as arrays of hexadecimal 16 bit integers. 1.1.1.4 ! root 1250: The endian-ness of generated values is controlled by ! 1251: REAL_WORDS_BIG_ENDIAN. 1.1.1.3 root 1252: 1253: To accommodate other types of computer arithmetic, all 1254: constants are also provided in a normal decimal radix 1255: which one can hope are correctly converted to a suitable 1256: format by the available C language compiler. To invoke 1257: this mode, the symbol UNK is defined. 1258: 1259: An important difference among these modes is a predefined 1260: set of machine arithmetic constants for each. The numbers 1261: MACHEP (the machine roundoff error), MAXNUM (largest number 1262: represented), and several other parameters are preset by 1263: the configuration symbol. Check the file const.c to 1264: ensure that these values are correct for your computer. 1265: 1266: For ANSI C compatibility, define ANSIC equal to 1. Currently 1267: this affects only the atan2 function and others that use it. */ 1.1 root 1268: 1269: /* Constant definitions for math error conditions. */ 1270: 1271: #define DOMAIN 1 /* argument domain error */ 1272: #define SING 2 /* argument singularity */ 1273: #define OVERFLOW 3 /* overflow range error */ 1274: #define UNDERFLOW 4 /* underflow range error */ 1275: #define TLOSS 5 /* total loss of precision */ 1276: #define PLOSS 6 /* partial loss of precision */ 1277: #define INVALID 7 /* NaN-producing operation */ 1278: 1279: /* e type constants used by high precision check routines */ 1280: 1.1.1.2 root 1281: #if LONG_DOUBLE_TYPE_SIZE == 128 1.1 root 1282: /* 0.0 */ 1283: unsigned EMUSHORT ezero[NE] = 1.1.1.2 root 1284: {0x0000, 0x0000, 0x0000, 0x0000, 1285: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,}; 1.1 root 1286: extern unsigned EMUSHORT ezero[]; 1287: 1288: /* 5.0E-1 */ 1289: unsigned EMUSHORT ehalf[NE] = 1.1.1.2 root 1290: {0x0000, 0x0000, 0x0000, 0x0000, 1291: 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3ffe,}; 1.1 root 1292: extern unsigned EMUSHORT ehalf[]; 1293: 1294: /* 1.0E0 */ 1295: unsigned EMUSHORT eone[NE] = 1.1.1.2 root 1296: {0x0000, 0x0000, 0x0000, 0x0000, 1297: 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,}; 1.1 root 1298: extern unsigned EMUSHORT eone[]; 1299: 1300: /* 2.0E0 */ 1301: unsigned EMUSHORT etwo[NE] = 1.1.1.2 root 1302: {0x0000, 0x0000, 0x0000, 0x0000, 1303: 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000,}; 1.1 root 1304: extern unsigned EMUSHORT etwo[]; 1305: 1306: /* 3.2E1 */ 1307: unsigned EMUSHORT e32[NE] = 1.1.1.2 root 1308: {0x0000, 0x0000, 0x0000, 0x0000, 1309: 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4004,}; 1.1 root 1310: extern unsigned EMUSHORT e32[]; 1311: 1312: /* 6.93147180559945309417232121458176568075500134360255E-1 */ 1313: unsigned EMUSHORT elog2[NE] = 1.1.1.2 root 1314: {0x40f3, 0xf6af, 0x03f2, 0xb398, 1315: 0xc9e3, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,}; 1.1 root 1316: extern unsigned EMUSHORT elog2[]; 1317: 1318: /* 1.41421356237309504880168872420969807856967187537695E0 */ 1319: unsigned EMUSHORT esqrt2[NE] = 1.1.1.2 root 1320: {0x1d6f, 0xbe9f, 0x754a, 0x89b3, 1321: 0x597d, 0x6484, 0174736, 0171463, 0132404, 0x3fff,}; 1.1 root 1322: extern unsigned EMUSHORT esqrt2[]; 1323: 1324: /* 3.14159265358979323846264338327950288419716939937511E0 */ 1325: unsigned EMUSHORT epi[NE] = 1.1.1.2 root 1326: {0x2902, 0x1cd1, 0x80dc, 0x628b, 1.1 root 1327: 0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,}; 1328: extern unsigned EMUSHORT epi[]; 1329: 1.1.1.2 root 1330: #else 1331: /* LONG_DOUBLE_TYPE_SIZE is other than 128 */ 1332: unsigned EMUSHORT ezero[NE] = 1333: {0, 0000000, 0000000, 0000000, 0000000, 0000000,}; 1334: unsigned EMUSHORT ehalf[NE] = 1335: {0, 0000000, 0000000, 0000000, 0100000, 0x3ffe,}; 1336: unsigned EMUSHORT eone[NE] = 1337: {0, 0000000, 0000000, 0000000, 0100000, 0x3fff,}; 1338: unsigned EMUSHORT etwo[NE] = 1339: {0, 0000000, 0000000, 0000000, 0100000, 0040000,}; 1340: unsigned EMUSHORT e32[NE] = 1341: {0, 0000000, 0000000, 0000000, 0100000, 0040004,}; 1342: unsigned EMUSHORT elog2[NE] = 1343: {0xc9e4, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,}; 1344: unsigned EMUSHORT esqrt2[NE] = 1345: {0x597e, 0x6484, 0174736, 0171463, 0132404, 0x3fff,}; 1346: unsigned EMUSHORT epi[NE] = 1347: {0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,}; 1348: #endif 1.1 root 1349: 1350: /* Control register for rounding precision. 1.1.1.3 root 1351: This can be set to 113 (if NE=10), 80 (if NE=6), 64, 56, 53, or 24 bits. */ 1352: 1.1 root 1353: int rndprc = NBITS; 1354: extern int rndprc; 1355: 1.1.1.4 ! root 1356: /* Clear out entire e-type number X. */ 1.1 root 1357: 1.1.1.3 root 1358: static void 1.1 root 1359: eclear (x) 1360: register unsigned EMUSHORT *x; 1361: { 1362: register int i; 1363: 1364: for (i = 0; i < NE; i++) 1365: *x++ = 0; 1366: } 1367: 1.1.1.4 ! root 1368: /* Move e-type number from A to B. */ 1.1 root 1369: 1.1.1.3 root 1370: static void 1.1 root 1371: emov (a, b) 1372: register unsigned EMUSHORT *a, *b; 1373: { 1374: register int i; 1375: 1376: for (i = 0; i < NE; i++) 1377: *b++ = *a++; 1378: } 1379: 1380: 1.1.1.4 ! root 1381: /* Absolute value of e-type X. */ 1.1 root 1382: 1.1.1.3 root 1383: static void 1.1 root 1384: eabs (x) 1.1.1.3 root 1385: unsigned EMUSHORT x[]; 1.1 root 1386: { 1.1.1.3 root 1387: /* sign is top bit of last word of external format */ 1388: x[NE - 1] &= 0x7fff; 1.1 root 1389: } 1390: 1.1.1.4 ! root 1391: /* Negate the e-type number X. */ 1.1 root 1392: 1.1.1.3 root 1393: static void 1.1 root 1394: eneg (x) 1395: unsigned EMUSHORT x[]; 1396: { 1397: 1398: x[NE - 1] ^= 0x8000; /* Toggle the sign bit */ 1399: } 1400: 1.1.1.4 ! root 1401: /* Return 1 if sign bit of e-type number X is nonzero, else zero. */ 1.1.1.3 root 1402: 1403: static int 1.1 root 1404: eisneg (x) 1405: unsigned EMUSHORT x[]; 1406: { 1407: 1408: if (x[NE - 1] & 0x8000) 1409: return (1); 1410: else 1411: return (0); 1412: } 1413: 1.1.1.4 ! root 1414: /* Return 1 if e-type number X is infinity, else return zero. */ 1.1.1.3 root 1415: 1416: static int 1.1 root 1417: eisinf (x) 1418: unsigned EMUSHORT x[]; 1419: { 1420: 1421: #ifdef NANS 1422: if (eisnan (x)) 1423: return (0); 1424: #endif 1425: if ((x[NE - 1] & 0x7fff) == 0x7fff) 1426: return (1); 1427: else 1428: return (0); 1429: } 1430: 1.1.1.3 root 1431: /* Check if e-type number is not a number. The bit pattern is one that we 1432: defined, so we know for sure how to detect it. */ 1.1 root 1433: 1.1.1.3 root 1434: static int 1.1 root 1435: eisnan (x) 1436: unsigned EMUSHORT x[]; 1437: { 1438: #ifdef NANS 1439: int i; 1.1.1.3 root 1440: 1441: /* NaN has maximum exponent */ 1.1 root 1442: if ((x[NE - 1] & 0x7fff) != 0x7fff) 1443: return (0); 1.1.1.3 root 1444: /* ... and non-zero significand field. */ 1.1 root 1445: for (i = 0; i < NE - 1; i++) 1446: { 1447: if (*x++ != 0) 1448: return (1); 1449: } 1450: #endif 1.1.1.3 root 1451: 1.1 root 1452: return (0); 1453: } 1454: 1.1.1.4 ! root 1455: /* Fill e-type number X with infinity pattern (IEEE) 1.1.1.2 root 1456: or largest possible number (non-IEEE). */ 1.1 root 1457: 1.1.1.3 root 1458: static void 1.1 root 1459: einfin (x) 1460: register unsigned EMUSHORT *x; 1461: { 1462: register int i; 1463: 1464: #ifdef INFINITY 1465: for (i = 0; i < NE - 1; i++) 1466: *x++ = 0; 1467: *x |= 32767; 1468: #else 1469: for (i = 0; i < NE - 1; i++) 1470: *x++ = 0xffff; 1471: *x |= 32766; 1472: if (rndprc < NBITS) 1473: { 1.1.1.2 root 1474: if (rndprc == 113) 1475: { 1476: *(x - 9) = 0; 1477: *(x - 8) = 0; 1478: } 1.1 root 1479: if (rndprc == 64) 1480: { 1481: *(x - 5) = 0; 1482: } 1483: if (rndprc == 53) 1484: { 1485: *(x - 4) = 0xf800; 1486: } 1487: else 1488: { 1489: *(x - 4) = 0; 1490: *(x - 3) = 0; 1491: *(x - 2) = 0xff00; 1492: } 1493: } 1494: #endif 1495: } 1496: 1497: /* Output an e-type NaN. 1498: This generates Intel's quiet NaN pattern for extended real. 1499: The exponent is 7fff, the leading mantissa word is c000. */ 1500: 1.1.1.3 root 1501: static void 1502: enan (x, sign) 1.1 root 1503: register unsigned EMUSHORT *x; 1.1.1.3 root 1504: int sign; 1.1 root 1505: { 1506: register int i; 1507: 1508: for (i = 0; i < NE - 2; i++) 1509: *x++ = 0; 1510: *x++ = 0xc000; 1.1.1.3 root 1511: *x = (sign << 15) | 0x7fff; 1.1 root 1512: } 1513: 1.1.1.4 ! root 1514: /* Move in an e-type number A, converting it to exploded e-type B. */ 1.1.1.3 root 1515: 1516: static void 1.1 root 1517: emovi (a, b) 1518: unsigned EMUSHORT *a, *b; 1519: { 1520: register unsigned EMUSHORT *p, *q; 1521: int i; 1522: 1523: q = b; 1524: p = a + (NE - 1); /* point to last word of external number */ 1525: /* get the sign bit */ 1526: if (*p & 0x8000) 1527: *q++ = 0xffff; 1528: else 1529: *q++ = 0; 1530: /* get the exponent */ 1531: *q = *p--; 1532: *q++ &= 0x7fff; /* delete the sign bit */ 1533: #ifdef INFINITY 1534: if ((*(q - 1) & 0x7fff) == 0x7fff) 1535: { 1536: #ifdef NANS 1537: if (eisnan (a)) 1538: { 1539: *q++ = 0; 1540: for (i = 3; i < NI; i++) 1541: *q++ = *p--; 1542: return; 1543: } 1544: #endif 1.1.1.3 root 1545: 1.1 root 1546: for (i = 2; i < NI; i++) 1547: *q++ = 0; 1548: return; 1549: } 1550: #endif 1.1.1.3 root 1551: 1.1 root 1552: /* clear high guard word */ 1553: *q++ = 0; 1554: /* move in the significand */ 1555: for (i = 0; i < NE - 1; i++) 1556: *q++ = *p--; 1557: /* clear low guard word */ 1558: *q = 0; 1559: } 1560: 1.1.1.4 ! root 1561: /* Move out exploded e-type number A, converting it to e type B. */ 1.1.1.3 root 1562: 1563: static void 1.1 root 1564: emovo (a, b) 1565: unsigned EMUSHORT *a, *b; 1566: { 1567: register unsigned EMUSHORT *p, *q; 1568: unsigned EMUSHORT i; 1.1.1.3 root 1569: int j; 1.1 root 1570: 1571: p = a; 1572: q = b + (NE - 1); /* point to output exponent */ 1573: /* combine sign and exponent */ 1574: i = *p++; 1575: if (i) 1576: *q-- = *p++ | 0x8000; 1577: else 1578: *q-- = *p++; 1579: #ifdef INFINITY 1580: if (*(p - 1) == 0x7fff) 1581: { 1582: #ifdef NANS 1583: if (eiisnan (a)) 1584: { 1.1.1.3 root 1585: enan (b, eiisneg (a)); 1.1 root 1586: return; 1587: } 1588: #endif 1589: einfin (b); 1.1.1.2 root 1590: return; 1.1 root 1591: } 1592: #endif 1593: /* skip over guard word */ 1594: ++p; 1595: /* move the significand */ 1.1.1.3 root 1596: for (j = 0; j < NE - 1; j++) 1.1 root 1597: *q-- = *p++; 1598: } 1599: 1.1.1.4 ! root 1600: /* Clear out exploded e-type number XI. */ 1.1 root 1601: 1.1.1.3 root 1602: static void 1.1 root 1603: ecleaz (xi) 1604: register unsigned EMUSHORT *xi; 1605: { 1606: register int i; 1607: 1608: for (i = 0; i < NI; i++) 1609: *xi++ = 0; 1610: } 1611: 1.1.1.4 ! root 1612: /* Clear out exploded e-type XI, but don't touch the sign. */ 1.1 root 1613: 1.1.1.3 root 1614: static void 1.1 root 1615: ecleazs (xi) 1616: register unsigned EMUSHORT *xi; 1617: { 1618: register int i; 1619: 1620: ++xi; 1621: for (i = 0; i < NI - 1; i++) 1622: *xi++ = 0; 1623: } 1624: 1.1.1.4 ! root 1625: /* Move exploded e-type number from A to B. */ 1.1.1.3 root 1626: 1627: static void 1.1 root 1628: emovz (a, b) 1629: register unsigned EMUSHORT *a, *b; 1630: { 1631: register int i; 1632: 1633: for (i = 0; i < NI - 1; i++) 1634: *b++ = *a++; 1635: /* clear low guard word */ 1636: *b = 0; 1637: } 1638: 1.1.1.4 ! root 1639: /* Generate exploded e-type NaN. 1.1 root 1640: The explicit pattern for this is maximum exponent and 1.1.1.3 root 1641: top two significant bits set. */ 1.1 root 1642: 1.1.1.3 root 1643: static void 1.1 root 1644: einan (x) 1645: unsigned EMUSHORT x[]; 1646: { 1647: 1648: ecleaz (x); 1649: x[E] = 0x7fff; 1650: x[M + 1] = 0xc000; 1651: } 1652: 1.1.1.4 ! root 1653: /* Return nonzero if exploded e-type X is a NaN. */ 1.1 root 1654: 1.1.1.3 root 1655: static int 1.1 root 1656: eiisnan (x) 1657: unsigned EMUSHORT x[]; 1658: { 1659: int i; 1660: 1661: if ((x[E] & 0x7fff) == 0x7fff) 1662: { 1663: for (i = M + 1; i < NI; i++) 1664: { 1665: if (x[i] != 0) 1666: return (1); 1667: } 1668: } 1669: return (0); 1670: } 1671: 1.1.1.4 ! root 1672: /* Return nonzero if sign of exploded e-type X is nonzero. */ 1.1.1.3 root 1673: 1674: static int 1675: eiisneg (x) 1676: unsigned EMUSHORT x[]; 1677: { 1678: 1679: return x[0] != 0; 1680: } 1681: 1.1.1.4 ! root 1682: /* Fill exploded e-type X with infinity pattern. 1.1 root 1683: This has maximum exponent and significand all zeros. */ 1684: 1.1.1.3 root 1685: static void 1.1 root 1686: eiinfin (x) 1687: unsigned EMUSHORT x[]; 1688: { 1689: 1690: ecleaz (x); 1691: x[E] = 0x7fff; 1692: } 1693: 1.1.1.4 ! root 1694: /* Return nonzero if exploded e-type X is infinite. */ 1.1 root 1695: 1.1.1.3 root 1696: static int 1.1 root 1697: eiisinf (x) 1698: unsigned EMUSHORT x[]; 1699: { 1700: 1701: #ifdef NANS 1702: if (eiisnan (x)) 1703: return (0); 1704: #endif 1705: if ((x[E] & 0x7fff) == 0x7fff) 1706: return (1); 1707: return (0); 1708: } 1709: 1710: 1.1.1.4 ! root 1711: /* Compare significands of numbers in internal exploded e-type format. 1.1.1.3 root 1712: Guard words are included in the comparison. 1713: 1714: Returns +1 if a > b 1715: 0 if a == b 1716: -1 if a < b */ 1717: 1718: static int 1.1 root 1719: ecmpm (a, b) 1720: register unsigned EMUSHORT *a, *b; 1721: { 1722: int i; 1723: 1724: a += M; /* skip up to significand area */ 1725: b += M; 1726: for (i = M; i < NI; i++) 1727: { 1728: if (*a++ != *b++) 1729: goto difrnt; 1730: } 1731: return (0); 1732: 1733: difrnt: 1734: if (*(--a) > *(--b)) 1735: return (1); 1736: else 1737: return (-1); 1738: } 1739: 1.1.1.4 ! root 1740: /* Shift significand of exploded e-type X down by 1 bit. */ 1.1 root 1741: 1.1.1.3 root 1742: static void 1.1 root 1743: eshdn1 (x) 1744: register unsigned EMUSHORT *x; 1745: { 1746: register unsigned EMUSHORT bits; 1747: int i; 1748: 1749: x += M; /* point to significand area */ 1750: 1751: bits = 0; 1752: for (i = M; i < NI; i++) 1753: { 1754: if (*x & 1) 1755: bits |= 1; 1756: *x >>= 1; 1757: if (bits & 2) 1758: *x |= 0x8000; 1759: bits <<= 1; 1760: ++x; 1761: } 1762: } 1763: 1.1.1.4 ! root 1764: /* Shift significand of exploded e-type X up by 1 bit. */ 1.1 root 1765: 1.1.1.3 root 1766: static void 1.1 root 1767: eshup1 (x) 1768: register unsigned EMUSHORT *x; 1769: { 1770: register unsigned EMUSHORT bits; 1771: int i; 1772: 1773: x += NI - 1; 1774: bits = 0; 1775: 1776: for (i = M; i < NI; i++) 1777: { 1778: if (*x & 0x8000) 1779: bits |= 1; 1780: *x <<= 1; 1781: if (bits & 2) 1782: *x |= 1; 1783: bits <<= 1; 1784: --x; 1785: } 1786: } 1787: 1788: 1.1.1.4 ! root 1789: /* Shift significand of exploded e-type X down by 8 bits. */ 1.1 root 1790: 1.1.1.3 root 1791: static void 1.1 root 1792: eshdn8 (x) 1793: register unsigned EMUSHORT *x; 1794: { 1795: register unsigned EMUSHORT newbyt, oldbyt; 1796: int i; 1797: 1798: x += M; 1799: oldbyt = 0; 1800: for (i = M; i < NI; i++) 1801: { 1802: newbyt = *x << 8; 1803: *x >>= 8; 1804: *x |= oldbyt; 1805: oldbyt = newbyt; 1806: ++x; 1807: } 1808: } 1809: 1.1.1.4 ! root 1810: /* Shift significand of exploded e-type X up by 8 bits. */ 1.1 root 1811: 1.1.1.3 root 1812: static void 1.1 root 1813: eshup8 (x) 1814: register unsigned EMUSHORT *x; 1815: { 1816: int i; 1817: register unsigned EMUSHORT newbyt, oldbyt; 1818: 1819: x += NI - 1; 1820: oldbyt = 0; 1821: 1822: for (i = M; i < NI; i++) 1823: { 1824: newbyt = *x >> 8; 1825: *x <<= 8; 1826: *x |= oldbyt; 1827: oldbyt = newbyt; 1828: --x; 1829: } 1830: } 1831: 1.1.1.4 ! root 1832: /* Shift significand of exploded e-type X up by 16 bits. */ 1.1 root 1833: 1.1.1.3 root 1834: static void 1.1 root 1835: eshup6 (x) 1836: register unsigned EMUSHORT *x; 1837: { 1838: int i; 1839: register unsigned EMUSHORT *p; 1840: 1841: p = x + M; 1842: x += M + 1; 1843: 1844: for (i = M; i < NI - 1; i++) 1845: *p++ = *x++; 1846: 1847: *p = 0; 1848: } 1849: 1.1.1.4 ! root 1850: /* Shift significand of exploded e-type X down by 16 bits. */ 1.1 root 1851: 1.1.1.3 root 1852: static void 1.1 root 1853: eshdn6 (x) 1854: register unsigned EMUSHORT *x; 1855: { 1856: int i; 1857: register unsigned EMUSHORT *p; 1858: 1859: x += NI - 1; 1860: p = x + 1; 1861: 1862: for (i = M; i < NI - 1; i++) 1863: *(--p) = *(--x); 1864: 1865: *(--p) = 0; 1866: } 1.1.1.4 ! root 1867: ! 1868: /* Add significands of exploded e-type X and Y. X + Y replaces Y. */ 1.1 root 1869: 1.1.1.3 root 1870: static void 1.1 root 1871: eaddm (x, y) 1872: unsigned EMUSHORT *x, *y; 1873: { 1874: register unsigned EMULONG a; 1875: int i; 1876: unsigned int carry; 1877: 1878: x += NI - 1; 1879: y += NI - 1; 1880: carry = 0; 1881: for (i = M; i < NI; i++) 1882: { 1883: a = (unsigned EMULONG) (*x) + (unsigned EMULONG) (*y) + carry; 1884: if (a & 0x10000) 1885: carry = 1; 1886: else 1887: carry = 0; 1888: *y = (unsigned EMUSHORT) a; 1889: --x; 1890: --y; 1891: } 1892: } 1893: 1.1.1.4 ! root 1894: /* Subtract significands of exploded e-type X and Y. Y - X replaces Y. */ 1.1 root 1895: 1.1.1.3 root 1896: static void 1.1 root 1897: esubm (x, y) 1898: unsigned EMUSHORT *x, *y; 1899: { 1900: unsigned EMULONG a; 1901: int i; 1902: unsigned int carry; 1903: 1904: x += NI - 1; 1905: y += NI - 1; 1906: carry = 0; 1907: for (i = M; i < NI; i++) 1908: { 1909: a = (unsigned EMULONG) (*y) - (unsigned EMULONG) (*x) - carry; 1910: if (a & 0x10000) 1911: carry = 1; 1912: else 1913: carry = 0; 1914: *y = (unsigned EMUSHORT) a; 1915: --x; 1916: --y; 1917: } 1918: } 1919: 1920: 1921: static unsigned EMUSHORT equot[NI]; 1922: 1.1.1.2 root 1923: 1924: #if 0 1925: /* Radix 2 shift-and-add versions of multiply and divide */ 1926: 1927: 1928: /* Divide significands */ 1929: 1.1 root 1930: int 1931: edivm (den, num) 1932: unsigned EMUSHORT den[], num[]; 1933: { 1934: int i; 1935: register unsigned EMUSHORT *p, *q; 1936: unsigned EMUSHORT j; 1937: 1938: p = &equot[0]; 1939: *p++ = num[0]; 1940: *p++ = num[1]; 1941: 1942: for (i = M; i < NI; i++) 1943: { 1944: *p++ = 0; 1945: } 1946: 1.1.1.3 root 1947: /* Use faster compare and subtraction if denominator has only 15 bits of 1948: significance. */ 1949: 1.1 root 1950: p = &den[M + 2]; 1951: if (*p++ == 0) 1952: { 1953: for (i = M + 3; i < NI; i++) 1954: { 1955: if (*p++ != 0) 1956: goto fulldiv; 1957: } 1958: if ((den[M + 1] & 1) != 0) 1959: goto fulldiv; 1960: eshdn1 (num); 1961: eshdn1 (den); 1962: 1963: p = &den[M + 1]; 1964: q = &num[M + 1]; 1965: 1966: for (i = 0; i < NBITS + 2; i++) 1967: { 1968: if (*p <= *q) 1969: { 1970: *q -= *p; 1971: j = 1; 1972: } 1973: else 1974: { 1975: j = 0; 1976: } 1977: eshup1 (equot); 1978: equot[NI - 2] |= j; 1979: eshup1 (num); 1980: } 1981: goto divdon; 1982: } 1983: 1.1.1.3 root 1984: /* The number of quotient bits to calculate is NBITS + 1 scaling guard 1985: bit + 1 roundoff bit. */ 1986: 1.1 root 1987: fulldiv: 1988: 1989: p = &equot[NI - 2]; 1990: for (i = 0; i < NBITS + 2; i++) 1991: { 1992: if (ecmpm (den, num) <= 0) 1993: { 1994: esubm (den, num); 1995: j = 1; /* quotient bit = 1 */ 1996: } 1997: else 1998: j = 0; 1999: eshup1 (equot); 2000: *p |= j; 2001: eshup1 (num); 2002: } 2003: 2004: divdon: 2005: 2006: eshdn1 (equot); 2007: eshdn1 (equot); 2008: 2009: /* test for nonzero remainder after roundoff bit */ 2010: p = &num[M]; 2011: j = 0; 2012: for (i = M; i < NI; i++) 2013: { 2014: j |= *p++; 2015: } 2016: if (j) 2017: j = 1; 2018: 2019: 2020: for (i = 0; i < NI; i++) 2021: num[i] = equot[i]; 2022: return ((int) j); 2023: } 2024: 2025: 2026: /* Multiply significands */ 2027: int 2028: emulm (a, b) 2029: unsigned EMUSHORT a[], b[]; 2030: { 2031: unsigned EMUSHORT *p, *q; 2032: int i, j, k; 2033: 2034: equot[0] = b[0]; 2035: equot[1] = b[1]; 2036: for (i = M; i < NI; i++) 2037: equot[i] = 0; 2038: 2039: p = &a[NI - 2]; 2040: k = NBITS; 1.1.1.3 root 2041: while (*p == 0) /* significand is not supposed to be zero */ 1.1 root 2042: { 2043: eshdn6 (a); 2044: k -= 16; 2045: } 2046: if ((*p & 0xff) == 0) 2047: { 2048: eshdn8 (a); 2049: k -= 8; 2050: } 2051: 2052: q = &equot[NI - 1]; 2053: j = 0; 2054: for (i = 0; i < k; i++) 2055: { 2056: if (*p & 1) 2057: eaddm (b, equot); 2058: /* remember if there were any nonzero bits shifted out */ 2059: if (*q & 1) 2060: j |= 1; 2061: eshdn1 (a); 2062: eshdn1 (equot); 2063: } 2064: 2065: for (i = 0; i < NI; i++) 2066: b[i] = equot[i]; 2067: 2068: /* return flag for lost nonzero bits */ 2069: return (j); 2070: } 2071: 1.1.1.2 root 2072: #else 2073: 1.1.1.4 ! root 2074: /* Radix 65536 versions of multiply and divide. */ 1.1.1.2 root 2075: 1.1.1.4 ! root 2076: /* Multiply significand of e-type number B ! 2077: by 16-bit quantity A, return e-type result to C. */ 1.1.1.2 root 2078: 1.1.1.3 root 2079: static void 1.1.1.2 root 2080: m16m (a, b, c) 1.1.1.3 root 2081: unsigned int a; 1.1.1.4 ! root 2082: unsigned EMUSHORT b[], c[]; 1.1.1.2 root 2083: { 1.1.1.4 ! root 2084: register unsigned EMUSHORT *pp; ! 2085: register unsigned EMULONG carry; ! 2086: unsigned EMUSHORT *ps; ! 2087: unsigned EMUSHORT p[NI]; ! 2088: unsigned EMULONG aa, m; 1.1.1.2 root 2089: int i; 2090: 2091: aa = a; 2092: pp = &p[NI-2]; 2093: *pp++ = 0; 2094: *pp = 0; 2095: ps = &b[NI-1]; 2096: 2097: for (i=M+1; i<NI; i++) 2098: { 2099: if (*ps == 0) 2100: { 2101: --ps; 2102: --pp; 2103: *(pp-1) = 0; 2104: } 2105: else 2106: { 1.1.1.4 ! root 2107: m = (unsigned EMULONG) aa * *ps--; 1.1.1.2 root 2108: carry = (m & 0xffff) + *pp; 1.1.1.4 ! root 2109: *pp-- = (unsigned EMUSHORT)carry; 1.1.1.2 root 2110: carry = (carry >> 16) + (m >> 16) + *pp; 1.1.1.4 ! root 2111: *pp = (unsigned EMUSHORT)carry; 1.1.1.2 root 2112: *(pp-1) = carry >> 16; 2113: } 2114: } 2115: for (i=M; i<NI; i++) 2116: c[i] = p[i]; 2117: } 2118: 1.1.1.4 ! root 2119: /* Divide significands of exploded e-types NUM / DEN. Neither the ! 2120: numerator NUM nor the denominator DEN is permitted to have its high guard ! 2121: word nonzero. */ 1.1.1.2 root 2122: 1.1.1.3 root 2123: static int 1.1.1.2 root 2124: edivm (den, num) 1.1.1.4 ! root 2125: unsigned EMUSHORT den[], num[]; 1.1.1.2 root 2126: { 2127: int i; 1.1.1.4 ! root 2128: register unsigned EMUSHORT *p; ! 2129: unsigned EMULONG tnum; ! 2130: unsigned EMUSHORT j, tdenm, tquot; ! 2131: unsigned EMUSHORT tprod[NI+1]; 1.1.1.2 root 2132: 2133: p = &equot[0]; 2134: *p++ = num[0]; 2135: *p++ = num[1]; 2136: 2137: for (i=M; i<NI; i++) 2138: { 2139: *p++ = 0; 2140: } 2141: eshdn1 (num); 2142: tdenm = den[M+1]; 2143: for (i=M; i<NI; i++) 2144: { 2145: /* Find trial quotient digit (the radix is 65536). */ 1.1.1.4 ! root 2146: tnum = (((unsigned EMULONG) num[M]) << 16) + num[M+1]; 1.1.1.2 root 2147: 2148: /* Do not execute the divide instruction if it will overflow. */ 2149: if ((tdenm * 0xffffL) < tnum) 2150: tquot = 0xffff; 2151: else 2152: tquot = tnum / tdenm; 2153: /* Multiply denominator by trial quotient digit. */ 1.1.1.3 root 2154: m16m ((unsigned int)tquot, den, tprod); 1.1.1.2 root 2155: /* The quotient digit may have been overestimated. */ 2156: if (ecmpm (tprod, num) > 0) 2157: { 2158: tquot -= 1; 2159: esubm (den, tprod); 2160: if (ecmpm (tprod, num) > 0) 2161: { 2162: tquot -= 1; 2163: esubm (den, tprod); 2164: } 2165: } 2166: esubm (tprod, num); 2167: equot[i] = tquot; 2168: eshup6(num); 2169: } 2170: /* test for nonzero remainder after roundoff bit */ 2171: p = &num[M]; 2172: j = 0; 2173: for (i=M; i<NI; i++) 2174: { 2175: j |= *p++; 2176: } 2177: if (j) 2178: j = 1; 2179: 2180: for (i=0; i<NI; i++) 2181: num[i] = equot[i]; 2182: 2183: return ((int)j); 2184: } 2185: 1.1.1.4 ! root 2186: /* Multiply significands of exploded e-type A and B, result in B. */ 1.1.1.2 root 2187: 1.1.1.3 root 2188: static int 1.1.1.2 root 2189: emulm (a, b) 1.1.1.4 ! root 2190: unsigned EMUSHORT a[], b[]; 1.1.1.2 root 2191: { 1.1.1.4 ! root 2192: unsigned EMUSHORT *p, *q; ! 2193: unsigned EMUSHORT pprod[NI]; ! 2194: unsigned EMUSHORT j; 1.1.1.2 root 2195: int i; 2196: 2197: equot[0] = b[0]; 2198: equot[1] = b[1]; 2199: for (i=M; i<NI; i++) 2200: equot[i] = 0; 2201: 2202: j = 0; 2203: p = &a[NI-1]; 2204: q = &equot[NI-1]; 2205: for (i=M+1; i<NI; i++) 2206: { 2207: if (*p == 0) 2208: { 2209: --p; 2210: } 2211: else 2212: { 1.1.1.3 root 2213: m16m ((unsigned int) *p--, b, pprod); 1.1.1.2 root 2214: eaddm(pprod, equot); 2215: } 2216: j |= *q; 2217: eshdn6(equot); 2218: } 2219: 2220: for (i=0; i<NI; i++) 2221: b[i] = equot[i]; 2222: 2223: /* return flag for lost nonzero bits */ 2224: return ((int)j); 2225: } 2226: #endif 1.1 root 2227: 2228: 1.1.1.3 root 2229: /* Normalize and round off. 2230: 1.1.1.4 ! root 2231: The internal format number to be rounded is S. ! 2232: Input LOST is 0 if the value is exact. This is the so-called sticky bit. 1.1.1.3 root 2233: 1.1.1.4 ! root 2234: Input SUBFLG indicates whether the number was obtained ! 2235: by a subtraction operation. In that case if LOST is nonzero 1.1.1.3 root 2236: then the number is slightly smaller than indicated. 2237: 1.1.1.4 ! root 2238: Input EXP is the biased exponent, which may be negative. ! 2239: the exponent field of S is ignored but is replaced by ! 2240: EXP as adjusted by normalization and rounding. 1.1.1.3 root 2241: 1.1.1.4 ! root 2242: Input RCNTRL is the rounding control. If it is nonzero, the ! 2243: returned value will be rounded to RNDPRC bits. 1.1 root 2244: 1.1.1.3 root 2245: For future reference: In order for emdnorm to round off denormal 1.1.1.2 root 2246: significands at the right point, the input exponent must be 2247: adjusted to be the actual value it would have after conversion to 2248: the final floating point type. This adjustment has been 2249: implemented for all type conversions (etoe53, etc.) and decimal 2250: conversions, but not for the arithmetic functions (eadd, etc.). 2251: Data types having standard 15-bit exponents are not affected by 2252: this, but SFmode and DFmode are affected. For example, ediv with 2253: rndprc = 24 will not round correctly to 24-bit precision if the 2254: result is denormal. */ 2255: 1.1 root 2256: static int rlast = -1; 2257: static int rw = 0; 2258: static unsigned EMUSHORT rmsk = 0; 2259: static unsigned EMUSHORT rmbit = 0; 2260: static unsigned EMUSHORT rebit = 0; 2261: static int re = 0; 2262: static unsigned EMUSHORT rbit[NI]; 2263: 1.1.1.3 root 2264: static void 1.1 root 2265: emdnorm (s, lost, subflg, exp, rcntrl) 2266: unsigned EMUSHORT s[]; 2267: int lost; 2268: int subflg; 2269: EMULONG exp; 2270: int rcntrl; 2271: { 2272: int i, j; 2273: unsigned EMUSHORT r; 2274: 2275: /* Normalize */ 2276: j = enormlz (s); 2277: 2278: /* a blank significand could mean either zero or infinity. */ 2279: #ifndef INFINITY 2280: if (j > NBITS) 2281: { 2282: ecleazs (s); 2283: return; 2284: } 2285: #endif 2286: exp -= j; 2287: #ifndef INFINITY 2288: if (exp >= 32767L) 2289: goto overf; 2290: #else 2291: if ((j > NBITS) && (exp < 32767)) 2292: { 2293: ecleazs (s); 2294: return; 2295: } 2296: #endif 2297: if (exp < 0L) 2298: { 2299: if (exp > (EMULONG) (-NBITS - 1)) 2300: { 2301: j = (int) exp; 2302: i = eshift (s, j); 2303: if (i) 2304: lost = 1; 2305: } 2306: else 2307: { 2308: ecleazs (s); 2309: return; 2310: } 2311: } 2312: /* Round off, unless told not to by rcntrl. */ 2313: if (rcntrl == 0) 2314: goto mdfin; 2315: /* Set up rounding parameters if the control register changed. */ 2316: if (rndprc != rlast) 2317: { 2318: ecleaz (rbit); 2319: switch (rndprc) 2320: { 2321: default: 2322: case NBITS: 2323: rw = NI - 1; /* low guard word */ 2324: rmsk = 0xffff; 2325: rmbit = 0x8000; 1.1.1.2 root 2326: re = rw - 1; 1.1 root 2327: rebit = 1; 2328: break; 1.1.1.2 root 2329: case 113: 2330: rw = 10; 2331: rmsk = 0x7fff; 2332: rmbit = 0x4000; 2333: rebit = 0x8000; 2334: re = rw; 2335: break; 1.1 root 2336: case 64: 2337: rw = 7; 2338: rmsk = 0xffff; 2339: rmbit = 0x8000; 2340: re = rw - 1; 2341: rebit = 1; 2342: break; 1.1.1.2 root 2343: /* For DEC or IBM arithmetic */ 1.1 root 2344: case 56: 2345: rw = 6; 2346: rmsk = 0xff; 2347: rmbit = 0x80; 2348: rebit = 0x100; 1.1.1.2 root 2349: re = rw; 1.1 root 2350: break; 2351: case 53: 2352: rw = 6; 2353: rmsk = 0x7ff; 2354: rmbit = 0x0400; 2355: rebit = 0x800; 1.1.1.2 root 2356: re = rw; 1.1 root 2357: break; 2358: case 24: 2359: rw = 4; 2360: rmsk = 0xff; 2361: rmbit = 0x80; 2362: rebit = 0x100; 1.1.1.2 root 2363: re = rw; 1.1 root 2364: break; 2365: } 1.1.1.2 root 2366: rbit[re] = rebit; 1.1 root 2367: rlast = rndprc; 2368: } 2369: 1.1.1.2 root 2370: /* Shift down 1 temporarily if the data structure has an implied 1.1.1.4 ! root 2371: most significant bit and the number is denormal. ! 2372: Intel long double denormals also lose one bit of precision. */ ! 2373: if ((exp <= 0) && (rndprc != NBITS) ! 2374: && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN))) 1.1 root 2375: { 1.1.1.2 root 2376: lost |= s[NI - 1] & 1; 2377: eshdn1 (s); 1.1 root 2378: } 1.1.1.2 root 2379: /* Clear out all bits below the rounding bit, 2380: remembering in r if any were nonzero. */ 2381: r = s[rw] & rmsk; 2382: if (rndprc < NBITS) 1.1 root 2383: { 2384: i = rw + 1; 2385: while (i < NI) 2386: { 2387: if (s[i]) 2388: r |= 1; 2389: s[i] = 0; 2390: ++i; 2391: } 2392: } 2393: s[rw] &= ~rmsk; 2394: if ((r & rmbit) != 0) 2395: { 2396: if (r == rmbit) 2397: { 2398: if (lost == 0) 2399: { /* round to even */ 2400: if ((s[re] & rebit) == 0) 2401: goto mddone; 2402: } 2403: else 2404: { 2405: if (subflg != 0) 2406: goto mddone; 2407: } 2408: } 2409: eaddm (rbit, s); 2410: } 2411: mddone: 1.1.1.4 ! root 2412: /* Undo the temporary shift for denormal values. */ ! 2413: if ((exp <= 0) && (rndprc != NBITS) ! 2414: && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN))) 1.1 root 2415: { 2416: eshup1 (s); 2417: } 2418: if (s[2] != 0) 2419: { /* overflow on roundoff */ 2420: eshdn1 (s); 2421: exp += 1; 2422: } 2423: mdfin: 2424: s[NI - 1] = 0; 2425: if (exp >= 32767L) 2426: { 2427: #ifndef INFINITY 2428: overf: 2429: #endif 2430: #ifdef INFINITY 2431: s[1] = 32767; 2432: for (i = 2; i < NI - 1; i++) 2433: s[i] = 0; 2434: if (extra_warnings) 2435: warning ("floating point overflow"); 2436: #else 2437: s[1] = 32766; 2438: s[2] = 0; 2439: for (i = M + 1; i < NI - 1; i++) 2440: s[i] = 0xffff; 2441: s[NI - 1] = 0; 1.1.1.2 root 2442: if ((rndprc < 64) || (rndprc == 113)) 1.1 root 2443: { 2444: s[rw] &= ~rmsk; 2445: if (rndprc == 24) 2446: { 2447: s[5] = 0; 2448: s[6] = 0; 2449: } 2450: } 2451: #endif 2452: return; 2453: } 2454: if (exp < 0) 2455: s[1] = 0; 2456: else 2457: s[1] = (unsigned EMUSHORT) exp; 2458: } 2459: 1.1.1.4 ! root 2460: /* Subtract. C = B - A, all e type numbers. */ 1.1 root 2461: 2462: static int subflg = 0; 2463: 1.1.1.3 root 2464: static void 1.1 root 2465: esub (a, b, c) 2466: unsigned EMUSHORT *a, *b, *c; 2467: { 2468: 2469: #ifdef NANS 2470: if (eisnan (a)) 2471: { 2472: emov (a, c); 2473: return; 2474: } 2475: if (eisnan (b)) 2476: { 2477: emov (b, c); 2478: return; 2479: } 2480: /* Infinity minus infinity is a NaN. 2481: Test for subtracting infinities of the same sign. */ 2482: if (eisinf (a) && eisinf (b) 2483: && ((eisneg (a) ^ eisneg (b)) == 0)) 2484: { 2485: mtherr ("esub", INVALID); 1.1.1.3 root 2486: enan (c, 0); 1.1 root 2487: return; 2488: } 2489: #endif 2490: subflg = 1; 2491: eadd1 (a, b, c); 2492: } 2493: 1.1.1.4 ! root 2494: /* Add. C = A + B, all e type. */ 1.1.1.3 root 2495: 2496: static void 1.1 root 2497: eadd (a, b, c) 2498: unsigned EMUSHORT *a, *b, *c; 2499: { 2500: 2501: #ifdef NANS 2502: /* NaN plus anything is a NaN. */ 2503: if (eisnan (a)) 2504: { 2505: emov (a, c); 2506: return; 2507: } 2508: if (eisnan (b)) 2509: { 2510: emov (b, c); 2511: return; 2512: } 2513: /* Infinity minus infinity is a NaN. 2514: Test for adding infinities of opposite signs. */ 2515: if (eisinf (a) && eisinf (b) 2516: && ((eisneg (a) ^ eisneg (b)) != 0)) 2517: { 2518: mtherr ("esub", INVALID); 1.1.1.3 root 2519: enan (c, 0); 1.1 root 2520: return; 2521: } 2522: #endif 2523: subflg = 0; 2524: eadd1 (a, b, c); 2525: } 2526: 1.1.1.4 ! root 2527: /* Arithmetic common to both addition and subtraction. */ ! 2528: 1.1.1.3 root 2529: static void 1.1 root 2530: eadd1 (a, b, c) 2531: unsigned EMUSHORT *a, *b, *c; 2532: { 2533: unsigned EMUSHORT ai[NI], bi[NI], ci[NI]; 2534: int i, lost, j, k; 2535: EMULONG lt, lta, ltb; 2536: 2537: #ifdef INFINITY 2538: if (eisinf (a)) 2539: { 2540: emov (a, c); 2541: if (subflg) 2542: eneg (c); 2543: return; 2544: } 2545: if (eisinf (b)) 2546: { 2547: emov (b, c); 2548: return; 2549: } 2550: #endif 2551: emovi (a, ai); 2552: emovi (b, bi); 2553: if (subflg) 2554: ai[0] = ~ai[0]; 2555: 2556: /* compare exponents */ 2557: lta = ai[E]; 2558: ltb = bi[E]; 2559: lt = lta - ltb; 2560: if (lt > 0L) 2561: { /* put the larger number in bi */ 2562: emovz (bi, ci); 2563: emovz (ai, bi); 2564: emovz (ci, ai); 2565: ltb = bi[E]; 2566: lt = -lt; 2567: } 2568: lost = 0; 2569: if (lt != 0L) 2570: { 2571: if (lt < (EMULONG) (-NBITS - 1)) 2572: goto done; /* answer same as larger addend */ 2573: k = (int) lt; 2574: lost = eshift (ai, k); /* shift the smaller number down */ 2575: } 2576: else 2577: { 2578: /* exponents were the same, so must compare significands */ 2579: i = ecmpm (ai, bi); 2580: if (i == 0) 2581: { /* the numbers are identical in magnitude */ 2582: /* if different signs, result is zero */ 2583: if (ai[0] != bi[0]) 2584: { 2585: eclear (c); 2586: return; 2587: } 2588: /* if same sign, result is double */ 1.1.1.4 ! root 2589: /* double denormalized tiny number */ 1.1 root 2590: if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0)) 2591: { 2592: eshup1 (bi); 2593: goto done; 2594: } 2595: /* add 1 to exponent unless both are zero! */ 2596: for (j = 1; j < NI - 1; j++) 2597: { 2598: if (bi[j] != 0) 2599: { 2600: /* This could overflow, but let emovo take care of that. */ 2601: ltb += 1; 2602: break; 2603: } 2604: } 2605: bi[E] = (unsigned EMUSHORT) ltb; 2606: goto done; 2607: } 2608: if (i > 0) 2609: { /* put the larger number in bi */ 2610: emovz (bi, ci); 2611: emovz (ai, bi); 2612: emovz (ci, ai); 2613: } 2614: } 2615: if (ai[0] == bi[0]) 2616: { 2617: eaddm (ai, bi); 2618: subflg = 0; 2619: } 2620: else 2621: { 2622: esubm (ai, bi); 2623: subflg = 1; 2624: } 2625: emdnorm (bi, lost, subflg, ltb, 64); 2626: 2627: done: 2628: emovo (bi, c); 2629: } 2630: 1.1.1.4 ! root 2631: /* Divide: C = B/A, all e type. */ 1.1.1.3 root 2632: 2633: static void 1.1 root 2634: ediv (a, b, c) 2635: unsigned EMUSHORT *a, *b, *c; 2636: { 2637: unsigned EMUSHORT ai[NI], bi[NI]; 1.1.1.4 ! root 2638: int i, sign; 1.1 root 2639: EMULONG lt, lta, ltb; 2640: 1.1.1.4 ! root 2641: /* IEEE says if result is not a NaN, the sign is "-" if and only if ! 2642: operands have opposite signs -- but flush -0 to 0 later if not IEEE. */ ! 2643: sign = eisneg(a) ^ eisneg(b); ! 2644: 1.1 root 2645: #ifdef NANS 2646: /* Return any NaN input. */ 2647: if (eisnan (a)) 2648: { 2649: emov (a, c); 2650: return; 2651: } 2652: if (eisnan (b)) 2653: { 2654: emov (b, c); 2655: return; 2656: } 2657: /* Zero over zero, or infinity over infinity, is a NaN. */ 2658: if (((ecmp (a, ezero) == 0) && (ecmp (b, ezero) == 0)) 2659: || (eisinf (a) && eisinf (b))) 2660: { 2661: mtherr ("ediv", INVALID); 1.1.1.4 ! root 2662: enan (c, sign); 1.1 root 2663: return; 2664: } 2665: #endif 2666: /* Infinity over anything else is infinity. */ 2667: #ifdef INFINITY 2668: if (eisinf (b)) 2669: { 2670: einfin (c); 1.1.1.4 ! root 2671: goto divsign; 1.1 root 2672: } 2673: /* Anything else over infinity is zero. */ 2674: if (eisinf (a)) 2675: { 2676: eclear (c); 1.1.1.4 ! root 2677: goto divsign; 1.1 root 2678: } 2679: #endif 2680: emovi (a, ai); 2681: emovi (b, bi); 2682: lta = ai[E]; 2683: ltb = bi[E]; 2684: if (bi[E] == 0) 2685: { /* See if numerator is zero. */ 2686: for (i = 1; i < NI - 1; i++) 2687: { 2688: if (bi[i] != 0) 2689: { 2690: ltb -= enormlz (bi); 2691: goto dnzro1; 2692: } 2693: } 2694: eclear (c); 1.1.1.4 ! root 2695: goto divsign; 1.1 root 2696: } 2697: dnzro1: 2698: 2699: if (ai[E] == 0) 2700: { /* possible divide by zero */ 2701: for (i = 1; i < NI - 1; i++) 2702: { 2703: if (ai[i] != 0) 2704: { 2705: lta -= enormlz (ai); 2706: goto dnzro2; 2707: } 2708: } 2709: /* Divide by zero is not an invalid operation. 2710: It is a divide-by-zero operation! */ 2711: einfin (c); 2712: mtherr ("ediv", SING); 1.1.1.4 ! root 2713: goto divsign; 1.1 root 2714: } 2715: dnzro2: 2716: 2717: i = edivm (ai, bi); 2718: /* calculate exponent */ 2719: lt = ltb - lta + EXONE; 2720: emdnorm (bi, i, 0, lt, 64); 2721: emovo (bi, c); 2722: 1.1.1.4 ! root 2723: divsign: 1.1 root 2724: 1.1.1.4 ! root 2725: if (sign ! 2726: #ifndef IEEE ! 2727: && (ecmp (c, ezero) != 0) ! 2728: #endif ! 2729: ) ! 2730: *(c+(NE-1)) |= 0x8000; ! 2731: else ! 2732: *(c+(NE-1)) &= ~0x8000; ! 2733: } 1.1 root 2734: 1.1.1.4 ! root 2735: /* Multiply e-types A and B, return e-type product C. */ 1.1.1.3 root 2736: 2737: static void 1.1 root 2738: emul (a, b, c) 2739: unsigned EMUSHORT *a, *b, *c; 2740: { 2741: unsigned EMUSHORT ai[NI], bi[NI]; 1.1.1.4 ! root 2742: int i, j, sign; 1.1 root 2743: EMULONG lt, lta, ltb; 2744: 1.1.1.4 ! root 2745: /* IEEE says if result is not a NaN, the sign is "-" if and only if ! 2746: operands have opposite signs -- but flush -0 to 0 later if not IEEE. */ ! 2747: sign = eisneg(a) ^ eisneg(b); ! 2748: 1.1 root 2749: #ifdef NANS 2750: /* NaN times anything is the same NaN. */ 2751: if (eisnan (a)) 2752: { 2753: emov (a, c); 2754: return; 2755: } 2756: if (eisnan (b)) 2757: { 2758: emov (b, c); 2759: return; 2760: } 2761: /* Zero times infinity is a NaN. */ 2762: if ((eisinf (a) && (ecmp (b, ezero) == 0)) 2763: || (eisinf (b) && (ecmp (a, ezero) == 0))) 2764: { 2765: mtherr ("emul", INVALID); 1.1.1.4 ! root 2766: enan (c, sign); 1.1 root 2767: return; 2768: } 2769: #endif 2770: /* Infinity times anything else is infinity. */ 2771: #ifdef INFINITY 2772: if (eisinf (a) || eisinf (b)) 2773: { 2774: einfin (c); 1.1.1.4 ! root 2775: goto mulsign; 1.1 root 2776: } 2777: #endif 2778: emovi (a, ai); 2779: emovi (b, bi); 2780: lta = ai[E]; 2781: ltb = bi[E]; 2782: if (ai[E] == 0) 2783: { 2784: for (i = 1; i < NI - 1; i++) 2785: { 2786: if (ai[i] != 0) 2787: { 2788: lta -= enormlz (ai); 2789: goto mnzer1; 2790: } 2791: } 2792: eclear (c); 1.1.1.4 ! root 2793: goto mulsign; 1.1 root 2794: } 2795: mnzer1: 2796: 2797: if (bi[E] == 0) 2798: { 2799: for (i = 1; i < NI - 1; i++) 2800: { 2801: if (bi[i] != 0) 2802: { 2803: ltb -= enormlz (bi); 2804: goto mnzer2; 2805: } 2806: } 2807: eclear (c); 1.1.1.4 ! root 2808: goto mulsign; 1.1 root 2809: } 2810: mnzer2: 2811: 2812: /* Multiply significands */ 2813: j = emulm (ai, bi); 2814: /* calculate exponent */ 2815: lt = lta + ltb - (EXONE - 1); 2816: emdnorm (bi, j, 0, lt, 64); 2817: emovo (bi, c); 2818: 1.1.1.4 ! root 2819: mulsign: 1.1 root 2820: 1.1.1.4 ! root 2821: if (sign ! 2822: #ifndef IEEE ! 2823: && (ecmp (c, ezero) != 0) ! 2824: #endif ! 2825: ) ! 2826: *(c+(NE-1)) |= 0x8000; ! 2827: else ! 2828: *(c+(NE-1)) &= ~0x8000; ! 2829: } 1.1 root 2830: 1.1.1.4 ! root 2831: /* Convert double precision PE to e-type Y. */ 1.1.1.3 root 2832: 2833: static void 1.1 root 2834: e53toe (pe, y) 2835: unsigned EMUSHORT *pe, *y; 2836: { 2837: #ifdef DEC 2838: 1.1.1.4 ! root 2839: dectoe (pe, y); 1.1 root 2840: 2841: #else 1.1.1.2 root 2842: #ifdef IBM 1.1 root 2843: 1.1.1.2 root 2844: ibmtoe (pe, y, DFmode); 2845: 2846: #else 1.1 root 2847: register unsigned EMUSHORT r; 2848: register unsigned EMUSHORT *e, *p; 2849: unsigned EMUSHORT yy[NI]; 2850: int denorm, k; 2851: 2852: e = pe; 2853: denorm = 0; /* flag if denormalized number */ 2854: ecleaz (yy); 1.1.1.4 ! root 2855: if (! REAL_WORDS_BIG_ENDIAN) ! 2856: e += 3; 1.1 root 2857: r = *e; 2858: yy[0] = 0; 2859: if (r & 0x8000) 2860: yy[0] = 0xffff; 2861: yy[M] = (r & 0x0f) | 0x10; 2862: r &= ~0x800f; /* strip sign and 4 significand bits */ 2863: #ifdef INFINITY 2864: if (r == 0x7ff0) 2865: { 2866: #ifdef NANS 1.1.1.4 ! root 2867: if (! REAL_WORDS_BIG_ENDIAN) 1.1 root 2868: { 1.1.1.4 ! root 2869: if (((pe[3] & 0xf) != 0) || (pe[2] != 0) ! 2870: || (pe[1] != 0) || (pe[0] != 0)) ! 2871: { ! 2872: enan (y, yy[0] != 0); ! 2873: return; ! 2874: } 1.1 root 2875: } 1.1.1.4 ! root 2876: else 1.1 root 2877: { 1.1.1.4 ! root 2878: if (((pe[0] & 0xf) != 0) || (pe[1] != 0) ! 2879: || (pe[2] != 0) || (pe[3] != 0)) ! 2880: { ! 2881: enan (y, yy[0] != 0); ! 2882: return; ! 2883: } 1.1 root 2884: } 2885: #endif /* NANS */ 2886: eclear (y); 2887: einfin (y); 2888: if (yy[0]) 2889: eneg (y); 2890: return; 2891: } 2892: #endif /* INFINITY */ 2893: r >>= 4; 2894: /* If zero exponent, then the significand is denormalized. 1.1.1.3 root 2895: So take back the understood high significand bit. */ 2896: 1.1 root 2897: if (r == 0) 2898: { 2899: denorm = 1; 2900: yy[M] &= ~0x10; 2901: } 2902: r += EXONE - 01777; 2903: yy[E] = r; 2904: p = &yy[M + 1]; 1.1.1.4 ! root 2905: #ifdef IEEE ! 2906: if (! REAL_WORDS_BIG_ENDIAN) ! 2907: { ! 2908: *p++ = *(--e); ! 2909: *p++ = *(--e); ! 2910: *p++ = *(--e); ! 2911: } ! 2912: else ! 2913: { ! 2914: ++e; ! 2915: *p++ = *e++; ! 2916: *p++ = *e++; ! 2917: *p++ = *e++; ! 2918: } 1.1 root 2919: #endif 2920: eshift (yy, -5); 2921: if (denorm) 2922: { /* if zero exponent, then normalize the significand */ 2923: if ((k = enormlz (yy)) > NBITS) 2924: ecleazs (yy); 2925: else 2926: yy[E] -= (unsigned EMUSHORT) (k - 1); 2927: } 2928: emovo (yy, y); 1.1.1.2 root 2929: #endif /* not IBM */ 1.1 root 2930: #endif /* not DEC */ 2931: } 2932: 1.1.1.4 ! root 2933: /* Convert double extended precision float PE to e type Y. */ ! 2934: 1.1.1.3 root 2935: static void 1.1 root 2936: e64toe (pe, y) 2937: unsigned EMUSHORT *pe, *y; 2938: { 2939: unsigned EMUSHORT yy[NI]; 2940: unsigned EMUSHORT *e, *p, *q; 2941: int i; 2942: 2943: e = pe; 2944: p = yy; 2945: for (i = 0; i < NE - 5; i++) 2946: *p++ = 0; 1.1.1.2 root 2947: /* This precision is not ordinarily supported on DEC or IBM. */ 1.1 root 2948: #ifdef DEC 2949: for (i = 0; i < 5; i++) 2950: *p++ = *e++; 2951: #endif 1.1.1.2 root 2952: #ifdef IBM 2953: p = &yy[0] + (NE - 1); 2954: *p-- = *e++; 2955: ++e; 2956: for (i = 0; i < 5; i++) 2957: *p-- = *e++; 2958: #endif 1.1.1.4 ! root 2959: #ifdef IEEE ! 2960: if (! REAL_WORDS_BIG_ENDIAN) ! 2961: { ! 2962: for (i = 0; i < 5; i++) ! 2963: *p++ = *e++; ! 2964: ! 2965: /* For denormal long double Intel format, shift significand up one ! 2966: -- but only if the top significand bit is zero. A top bit of 1 ! 2967: is "pseudodenormal" when the exponent is zero. */ ! 2968: if((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2] & 0x8000) == 0) ! 2969: { ! 2970: unsigned EMUSHORT temp[NI]; ! 2971: ! 2972: emovi(yy, temp); ! 2973: eshup1(temp); ! 2974: emovo(temp,y); ! 2975: return; ! 2976: } ! 2977: } ! 2978: else ! 2979: { ! 2980: p = &yy[0] + (NE - 1); ! 2981: *p-- = *e++; ! 2982: ++e; ! 2983: for (i = 0; i < 4; i++) ! 2984: *p-- = *e++; ! 2985: } 1.1 root 2986: #endif 2987: #ifdef INFINITY 1.1.1.4 ! root 2988: /* Point to the exponent field and check max exponent cases. */ ! 2989: p = &yy[NE - 1]; 1.1 root 2990: if (*p == 0x7fff) 2991: { 2992: #ifdef NANS 1.1.1.4 ! root 2993: if (! REAL_WORDS_BIG_ENDIAN) 1.1 root 2994: { 1.1.1.4 ! root 2995: for (i = 0; i < 4; i++) 1.1 root 2996: { 1.1.1.4 ! root 2997: if ((i != 3 && pe[i] != 0) ! 2998: /* Anything but 0x8000 here, including 0, is a NaN. */ ! 2999: || (i == 3 && pe[i] != 0x8000)) ! 3000: { ! 3001: enan (y, (*p & 0x8000) != 0); ! 3002: return; ! 3003: } 1.1 root 3004: } 3005: } 1.1.1.4 ! root 3006: else 1.1 root 3007: { 1.1.1.4 ! root 3008: for (i = 1; i <= 4; i++) 1.1 root 3009: { 1.1.1.4 ! root 3010: if (pe[i] != 0) ! 3011: { ! 3012: enan (y, (*p & 0x8000) != 0); ! 3013: return; ! 3014: } 1.1 root 3015: } 3016: } 3017: #endif /* NANS */ 3018: eclear (y); 3019: einfin (y); 3020: if (*p & 0x8000) 3021: eneg (y); 3022: return; 3023: } 3024: #endif /* INFINITY */ 1.1.1.4 ! root 3025: p = yy; ! 3026: q = y; 1.1 root 3027: for (i = 0; i < NE; i++) 3028: *q++ = *p++; 3029: } 3030: 1.1.1.4 ! root 3031: /* Convert 128-bit long double precision float PE to e type Y. */ 1.1 root 3032: 1.1.1.3 root 3033: static void 1.1.1.2 root 3034: e113toe (pe, y) 1.1 root 3035: unsigned EMUSHORT *pe, *y; 3036: { 3037: register unsigned EMUSHORT r; 1.1.1.2 root 3038: unsigned EMUSHORT *e, *p; 1.1 root 3039: unsigned EMUSHORT yy[NI]; 1.1.1.2 root 3040: int denorm, i; 1.1 root 3041: 3042: e = pe; 1.1.1.2 root 3043: denorm = 0; 1.1 root 3044: ecleaz (yy); 1.1.1.4 ! root 3045: #ifdef IEEE ! 3046: if (! REAL_WORDS_BIG_ENDIAN) ! 3047: e += 7; 1.1 root 3048: #endif 3049: r = *e; 3050: yy[0] = 0; 3051: if (r & 0x8000) 3052: yy[0] = 0xffff; 1.1.1.2 root 3053: r &= 0x7fff; 3054: #ifdef INFINITY 3055: if (r == 0x7fff) 3056: { 3057: #ifdef NANS 1.1.1.4 ! root 3058: if (! REAL_WORDS_BIG_ENDIAN) 1.1.1.2 root 3059: { 1.1.1.4 ! root 3060: for (i = 0; i < 7; i++) 1.1.1.2 root 3061: { 1.1.1.4 ! root 3062: if (pe[i] != 0) ! 3063: { ! 3064: enan (y, yy[0] != 0); ! 3065: return; ! 3066: } 1.1.1.2 root 3067: } 3068: } 1.1.1.4 ! root 3069: else 1.1.1.2 root 3070: { 1.1.1.4 ! root 3071: for (i = 1; i < 8; i++) 1.1.1.2 root 3072: { 1.1.1.4 ! root 3073: if (pe[i] != 0) ! 3074: { ! 3075: enan (y, yy[0] != 0); ! 3076: return; ! 3077: } 1.1.1.2 root 3078: } 3079: } 3080: #endif /* NANS */ 3081: eclear (y); 3082: einfin (y); 3083: if (yy[0]) 3084: eneg (y); 3085: return; 3086: } 3087: #endif /* INFINITY */ 3088: yy[E] = r; 3089: p = &yy[M + 1]; 1.1.1.4 ! root 3090: #ifdef IEEE ! 3091: if (! REAL_WORDS_BIG_ENDIAN) ! 3092: { ! 3093: for (i = 0; i < 7; i++) ! 3094: *p++ = *(--e); ! 3095: } ! 3096: else ! 3097: { ! 3098: ++e; ! 3099: for (i = 0; i < 7; i++) ! 3100: *p++ = *e++; ! 3101: } 1.1.1.2 root 3102: #endif 3103: /* If denormal, remove the implied bit; else shift down 1. */ 3104: if (r == 0) 3105: { 3106: yy[M] = 0; 3107: } 3108: else 3109: { 3110: yy[M] = 1; 3111: eshift (yy, -1); 3112: } 3113: emovo (yy, y); 3114: } 3115: 1.1.1.4 ! root 3116: /* Convert single precision float PE to e type Y. */ 1.1.1.3 root 3117: 3118: static void 1.1.1.2 root 3119: e24toe (pe, y) 3120: unsigned EMUSHORT *pe, *y; 3121: { 3122: #ifdef IBM 3123: 3124: ibmtoe (pe, y, SFmode); 3125: 3126: #else 3127: register unsigned EMUSHORT r; 3128: register unsigned EMUSHORT *e, *p; 3129: unsigned EMUSHORT yy[NI]; 3130: int denorm, k; 3131: 3132: e = pe; 3133: denorm = 0; /* flag if denormalized number */ 3134: ecleaz (yy); 1.1.1.4 ! root 3135: #ifdef IEEE ! 3136: if (! REAL_WORDS_BIG_ENDIAN) ! 3137: e += 1; 1.1.1.2 root 3138: #endif 3139: #ifdef DEC 3140: e += 1; 3141: #endif 3142: r = *e; 3143: yy[0] = 0; 3144: if (r & 0x8000) 3145: yy[0] = 0xffff; 3146: yy[M] = (r & 0x7f) | 0200; 3147: r &= ~0x807f; /* strip sign and 7 significand bits */ 1.1 root 3148: #ifdef INFINITY 3149: if (r == 0x7f80) 3150: { 3151: #ifdef NANS 1.1.1.4 ! root 3152: if (REAL_WORDS_BIG_ENDIAN) 1.1 root 3153: { 1.1.1.4 ! root 3154: if (((pe[0] & 0x7f) != 0) || (pe[1] != 0)) ! 3155: { ! 3156: enan (y, yy[0] != 0); ! 3157: return; ! 3158: } 1.1 root 3159: } 1.1.1.4 ! root 3160: else 1.1 root 3161: { 1.1.1.4 ! root 3162: if (((pe[1] & 0x7f) != 0) || (pe[0] != 0)) ! 3163: { ! 3164: enan (y, yy[0] != 0); ! 3165: return; ! 3166: } 1.1 root 3167: } 3168: #endif /* NANS */ 3169: eclear (y); 3170: einfin (y); 3171: if (yy[0]) 3172: eneg (y); 3173: return; 3174: } 3175: #endif /* INFINITY */ 3176: r >>= 7; 3177: /* If zero exponent, then the significand is denormalized. 1.1.1.3 root 3178: So take back the understood high significand bit. */ 1.1 root 3179: if (r == 0) 3180: { 3181: denorm = 1; 3182: yy[M] &= ~0200; 3183: } 3184: r += EXONE - 0177; 3185: yy[E] = r; 3186: p = &yy[M + 1]; 3187: #ifdef DEC 3188: *p++ = *(--e); 3189: #endif 1.1.1.4 ! root 3190: #ifdef IEEE ! 3191: if (! REAL_WORDS_BIG_ENDIAN) ! 3192: *p++ = *(--e); ! 3193: else ! 3194: { ! 3195: ++e; ! 3196: *p++ = *e++; ! 3197: } 1.1 root 3198: #endif 3199: eshift (yy, -8); 3200: if (denorm) 3201: { /* if zero exponent, then normalize the significand */ 3202: if ((k = enormlz (yy)) > NBITS) 3203: ecleazs (yy); 3204: else 3205: yy[E] -= (unsigned EMUSHORT) (k - 1); 3206: } 3207: emovo (yy, y); 1.1.1.2 root 3208: #endif /* not IBM */ 3209: } 3210: 1.1.1.4 ! root 3211: /* Convert e-type X to IEEE 128-bit long double format E. */ 1.1.1.2 root 3212: 1.1.1.3 root 3213: static void 1.1.1.2 root 3214: etoe113 (x, e) 3215: unsigned EMUSHORT *x, *e; 3216: { 3217: unsigned EMUSHORT xi[NI]; 3218: EMULONG exp; 3219: int rndsav; 3220: 3221: #ifdef NANS 3222: if (eisnan (x)) 3223: { 1.1.1.3 root 3224: make_nan (e, eisneg (x), TFmode); 1.1.1.2 root 3225: return; 3226: } 3227: #endif 3228: emovi (x, xi); 3229: exp = (EMULONG) xi[E]; 3230: #ifdef INFINITY 3231: if (eisinf (x)) 3232: goto nonorm; 3233: #endif 3234: /* round off to nearest or even */ 3235: rndsav = rndprc; 3236: rndprc = 113; 3237: emdnorm (xi, 0, 0, exp, 64); 3238: rndprc = rndsav; 3239: nonorm: 3240: toe113 (xi, e); 1.1 root 3241: } 3242: 1.1.1.4 ! root 3243: /* Convert exploded e-type X, that has already been rounded to ! 3244: 113-bit precision, to IEEE 128-bit long double format Y. */ 1.1.1.3 root 3245: 1.1.1.2 root 3246: static void 3247: toe113 (a, b) 3248: unsigned EMUSHORT *a, *b; 3249: { 3250: register unsigned EMUSHORT *p, *q; 3251: unsigned EMUSHORT i; 3252: 3253: #ifdef NANS 3254: if (eiisnan (a)) 3255: { 1.1.1.3 root 3256: make_nan (b, eiisneg (a), TFmode); 1.1.1.2 root 3257: return; 3258: } 3259: #endif 3260: p = a; 1.1.1.4 ! root 3261: if (REAL_WORDS_BIG_ENDIAN) ! 3262: q = b; ! 3263: else ! 3264: q = b + 7; /* point to output exponent */ 1.1.1.2 root 3265: 3266: /* If not denormal, delete the implied bit. */ 3267: if (a[E] != 0) 3268: { 3269: eshup1 (a); 3270: } 3271: /* combine sign and exponent */ 3272: i = *p++; 1.1.1.4 ! root 3273: if (REAL_WORDS_BIG_ENDIAN) ! 3274: { ! 3275: if (i) ! 3276: *q++ = *p++ | 0x8000; ! 3277: else ! 3278: *q++ = *p++; ! 3279: } 1.1.1.2 root 3280: else 1.1.1.4 ! root 3281: { ! 3282: if (i) ! 3283: *q-- = *p++ | 0x8000; ! 3284: else ! 3285: *q-- = *p++; ! 3286: } 1.1.1.2 root 3287: /* skip over guard word */ 3288: ++p; 3289: /* move the significand */ 1.1.1.4 ! root 3290: if (REAL_WORDS_BIG_ENDIAN) ! 3291: { ! 3292: for (i = 0; i < 7; i++) ! 3293: *q++ = *p++; ! 3294: } ! 3295: else ! 3296: { ! 3297: for (i = 0; i < 7; i++) ! 3298: *q-- = *p++; ! 3299: } 1.1.1.2 root 3300: } 1.1 root 3301: 1.1.1.4 ! root 3302: /* Convert e-type X to IEEE double extended format E. */ ! 3303: 1.1.1.3 root 3304: static void 1.1 root 3305: etoe64 (x, e) 3306: unsigned EMUSHORT *x, *e; 3307: { 3308: unsigned EMUSHORT xi[NI]; 3309: EMULONG exp; 3310: int rndsav; 3311: 3312: #ifdef NANS 3313: if (eisnan (x)) 3314: { 1.1.1.3 root 3315: make_nan (e, eisneg (x), XFmode); 1.1 root 3316: return; 3317: } 3318: #endif 3319: emovi (x, xi); 3320: /* adjust exponent for offset */ 3321: exp = (EMULONG) xi[E]; 3322: #ifdef INFINITY 3323: if (eisinf (x)) 3324: goto nonorm; 3325: #endif 3326: /* round off to nearest or even */ 3327: rndsav = rndprc; 3328: rndprc = 64; 3329: emdnorm (xi, 0, 0, exp, 64); 3330: rndprc = rndsav; 3331: nonorm: 3332: toe64 (xi, e); 3333: } 3334: 1.1.1.4 ! root 3335: /* Convert exploded e-type X, that has already been rounded to ! 3336: 64-bit precision, to IEEE double extended format Y. */ 1.1.1.3 root 3337: 1.1 root 3338: static void 3339: toe64 (a, b) 3340: unsigned EMUSHORT *a, *b; 3341: { 3342: register unsigned EMUSHORT *p, *q; 3343: unsigned EMUSHORT i; 3344: 3345: #ifdef NANS 3346: if (eiisnan (a)) 3347: { 1.1.1.3 root 3348: make_nan (b, eiisneg (a), XFmode); 1.1 root 3349: return; 3350: } 3351: #endif 1.1.1.4 ! root 3352: /* Shift denormal long double Intel format significand down one bit. */ ! 3353: if ((a[E] == 0) && ! REAL_WORDS_BIG_ENDIAN) ! 3354: eshdn1 (a); 1.1 root 3355: p = a; 1.1.1.4 ! root 3356: #ifdef IBM 1.1 root 3357: q = b; 1.1.1.4 ! root 3358: #endif ! 3359: #ifdef DEC ! 3360: q = b + 4; ! 3361: #endif ! 3362: #ifdef IEEE ! 3363: if (REAL_WORDS_BIG_ENDIAN) ! 3364: q = b; ! 3365: else ! 3366: { ! 3367: q = b + 4; /* point to output exponent */ 1.1 root 3368: #if LONG_DOUBLE_TYPE_SIZE == 96 1.1.1.4 ! root 3369: /* Clear the last two bytes of 12-byte Intel format */ ! 3370: *(q+1) = 0; 1.1 root 3371: #endif 1.1.1.4 ! root 3372: } 1.1 root 3373: #endif 3374: 3375: /* combine sign and exponent */ 3376: i = *p++; 1.1.1.4 ! root 3377: #ifdef IBM 1.1 root 3378: if (i) 3379: *q++ = *p++ | 0x8000; 3380: else 3381: *q++ = *p++; 3382: *q++ = 0; 1.1.1.4 ! root 3383: #endif ! 3384: #ifdef DEC 1.1 root 3385: if (i) 3386: *q-- = *p++ | 0x8000; 3387: else 3388: *q-- = *p++; 3389: #endif 1.1.1.4 ! root 3390: #ifdef IEEE ! 3391: if (REAL_WORDS_BIG_ENDIAN) ! 3392: { ! 3393: if (i) ! 3394: *q++ = *p++ | 0x8000; ! 3395: else ! 3396: *q++ = *p++; ! 3397: *q++ = 0; ! 3398: } ! 3399: else ! 3400: { ! 3401: if (i) ! 3402: *q-- = *p++ | 0x8000; ! 3403: else ! 3404: *q-- = *p++; ! 3405: } ! 3406: #endif 1.1 root 3407: /* skip over guard word */ 3408: ++p; 3409: /* move the significand */ 1.1.1.4 ! root 3410: #ifdef IBM 1.1 root 3411: for (i = 0; i < 4; i++) 3412: *q++ = *p++; 1.1.1.4 ! root 3413: #endif ! 3414: #ifdef DEC 1.1 root 3415: for (i = 0; i < 4; i++) 3416: *q-- = *p++; 3417: #endif 1.1.1.4 ! root 3418: #ifdef IEEE ! 3419: if (REAL_WORDS_BIG_ENDIAN) ! 3420: { ! 3421: for (i = 0; i < 4; i++) ! 3422: *q++ = *p++; ! 3423: } ! 3424: else ! 3425: { ! 3426: #ifdef INFINITY ! 3427: if (eiisinf (a)) ! 3428: { ! 3429: /* Intel long double infinity significand. */ ! 3430: *q-- = 0x8000; ! 3431: *q-- = 0; ! 3432: *q-- = 0; ! 3433: *q = 0; ! 3434: return; ! 3435: } ! 3436: #endif ! 3437: for (i = 0; i < 4; i++) ! 3438: *q-- = *p++; ! 3439: } ! 3440: #endif 1.1 root 3441: } 3442: 1.1.1.4 ! root 3443: /* e type to double precision. */ 1.1 root 3444: 3445: #ifdef DEC 1.1.1.4 ! root 3446: /* Convert e-type X to DEC-format double E. */ 1.1 root 3447: 1.1.1.3 root 3448: static void 1.1 root 3449: etoe53 (x, e) 3450: unsigned EMUSHORT *x, *e; 3451: { 3452: etodec (x, e); /* see etodec.c */ 3453: } 3454: 1.1.1.4 ! root 3455: /* Convert exploded e-type X, that has already been rounded to ! 3456: 56-bit double precision, to DEC double Y. */ ! 3457: 1.1 root 3458: static void 3459: toe53 (x, y) 3460: unsigned EMUSHORT *x, *y; 3461: { 3462: todec (x, y); 3463: } 3464: 3465: #else 1.1.1.2 root 3466: #ifdef IBM 1.1.1.4 ! root 3467: /* Convert e-type X to IBM 370-format double E. */ 1.1.1.2 root 3468: 1.1.1.3 root 3469: static void 1.1.1.2 root 3470: etoe53 (x, e) 3471: unsigned EMUSHORT *x, *e; 3472: { 3473: etoibm (x, e, DFmode); 3474: } 3475: 1.1.1.4 ! root 3476: /* Convert exploded e-type X, that has already been rounded to ! 3477: 56-bit precision, to IBM 370 double Y. */ ! 3478: 1.1.1.2 root 3479: static void 3480: toe53 (x, y) 3481: unsigned EMUSHORT *x, *y; 3482: { 3483: toibm (x, y, DFmode); 3484: } 3485: 3486: #else /* it's neither DEC nor IBM */ 1.1 root 3487: 1.1.1.4 ! root 3488: /* Convert e-type X to IEEE double E. */ ! 3489: 1.1.1.3 root 3490: static void 1.1 root 3491: etoe53 (x, e) 3492: unsigned EMUSHORT *x, *e; 3493: { 3494: unsigned EMUSHORT xi[NI]; 3495: EMULONG exp; 3496: int rndsav; 3497: 3498: #ifdef NANS 3499: if (eisnan (x)) 3500: { 1.1.1.3 root 3501: make_nan (e, eisneg (x), DFmode); 1.1 root 3502: return; 3503: } 3504: #endif 3505: emovi (x, xi); 3506: /* adjust exponent for offsets */ 3507: exp = (EMULONG) xi[E] - (EXONE - 0x3ff); 3508: #ifdef INFINITY 3509: if (eisinf (x)) 3510: goto nonorm; 3511: #endif 3512: /* round off to nearest or even */ 3513: rndsav = rndprc; 3514: rndprc = 53; 3515: emdnorm (xi, 0, 0, exp, 64); 3516: rndprc = rndsav; 3517: nonorm: 3518: toe53 (xi, e); 3519: } 3520: 1.1.1.4 ! root 3521: /* Convert exploded e-type X, that has already been rounded to ! 3522: 53-bit precision, to IEEE double Y. */ 1.1 root 3523: 3524: static void 3525: toe53 (x, y) 3526: unsigned EMUSHORT *x, *y; 3527: { 3528: unsigned EMUSHORT i; 3529: unsigned EMUSHORT *p; 3530: 3531: #ifdef NANS 3532: if (eiisnan (x)) 3533: { 1.1.1.3 root 3534: make_nan (y, eiisneg (x), DFmode); 1.1 root 3535: return; 3536: } 3537: #endif 3538: p = &x[0]; 1.1.1.4 ! root 3539: #ifdef IEEE ! 3540: if (! REAL_WORDS_BIG_ENDIAN) ! 3541: y += 3; 1.1 root 3542: #endif 3543: *y = 0; /* output high order */ 3544: if (*p++) 3545: *y = 0x8000; /* output sign bit */ 3546: 3547: i = *p++; 3548: if (i >= (unsigned int) 2047) 3549: { /* Saturate at largest number less than infinity. */ 3550: #ifdef INFINITY 3551: *y |= 0x7ff0; 1.1.1.4 ! root 3552: if (! REAL_WORDS_BIG_ENDIAN) ! 3553: { ! 3554: *(--y) = 0; ! 3555: *(--y) = 0; ! 3556: *(--y) = 0; ! 3557: } ! 3558: else ! 3559: { ! 3560: ++y; ! 3561: *y++ = 0; ! 3562: *y++ = 0; ! 3563: *y++ = 0; ! 3564: } 1.1 root 3565: #else 3566: *y |= (unsigned EMUSHORT) 0x7fef; 1.1.1.4 ! root 3567: if (! REAL_WORDS_BIG_ENDIAN) ! 3568: { ! 3569: *(--y) = 0xffff; ! 3570: *(--y) = 0xffff; ! 3571: *(--y) = 0xffff; ! 3572: } ! 3573: else ! 3574: { ! 3575: ++y; ! 3576: *y++ = 0xffff; ! 3577: *y++ = 0xffff; ! 3578: *y++ = 0xffff; ! 3579: } 1.1 root 3580: #endif 3581: return; 3582: } 3583: if (i == 0) 3584: { 3585: eshift (x, 4); 3586: } 3587: else 3588: { 3589: i <<= 4; 3590: eshift (x, 5); 3591: } 3592: i |= *p++ & (unsigned EMUSHORT) 0x0f; /* *p = xi[M] */ 3593: *y |= (unsigned EMUSHORT) i; /* high order output already has sign bit set */ 1.1.1.4 ! root 3594: if (! REAL_WORDS_BIG_ENDIAN) ! 3595: { ! 3596: *(--y) = *p++; ! 3597: *(--y) = *p++; ! 3598: *(--y) = *p; ! 3599: } ! 3600: else ! 3601: { ! 3602: ++y; ! 3603: *y++ = *p++; ! 3604: *y++ = *p++; ! 3605: *y++ = *p++; ! 3606: } 1.1 root 3607: } 3608: 1.1.1.2 root 3609: #endif /* not IBM */ 1.1 root 3610: #endif /* not DEC */ 3611: 3612: 3613: 1.1.1.4 ! root 3614: /* e type to single precision. */ 1.1.1.3 root 3615: 1.1.1.2 root 3616: #ifdef IBM 1.1.1.4 ! root 3617: /* Convert e-type X to IBM 370 float E. */ 1.1.1.2 root 3618: 1.1.1.3 root 3619: static void 1.1.1.2 root 3620: etoe24 (x, e) 3621: unsigned EMUSHORT *x, *e; 3622: { 3623: etoibm (x, e, SFmode); 3624: } 3625: 1.1.1.4 ! root 3626: /* Convert exploded e-type X, that has already been rounded to ! 3627: float precision, to IBM 370 float Y. */ ! 3628: 1.1.1.2 root 3629: static void 3630: toe24 (x, y) 3631: unsigned EMUSHORT *x, *y; 3632: { 3633: toibm (x, y, SFmode); 3634: } 3635: 3636: #else 1.1.1.4 ! root 3637: /* Convert e-type X to IEEE float E. DEC float is the same as IEEE float. */ 1.1.1.2 root 3638: 1.1.1.3 root 3639: static void 1.1 root 3640: etoe24 (x, e) 3641: unsigned EMUSHORT *x, *e; 3642: { 3643: EMULONG exp; 3644: unsigned EMUSHORT xi[NI]; 3645: int rndsav; 3646: 3647: #ifdef NANS 3648: if (eisnan (x)) 3649: { 1.1.1.3 root 3650: make_nan (e, eisneg (x), SFmode); 1.1 root 3651: return; 3652: } 3653: #endif 3654: emovi (x, xi); 3655: /* adjust exponent for offsets */ 3656: exp = (EMULONG) xi[E] - (EXONE - 0177); 3657: #ifdef INFINITY 3658: if (eisinf (x)) 3659: goto nonorm; 3660: #endif 3661: /* round off to nearest or even */ 3662: rndsav = rndprc; 3663: rndprc = 24; 3664: emdnorm (xi, 0, 0, exp, 64); 3665: rndprc = rndsav; 3666: nonorm: 3667: toe24 (xi, e); 3668: } 3669: 1.1.1.4 ! root 3670: /* Convert exploded e-type X, that has already been rounded to ! 3671: float precision, to IEEE float Y. */ ! 3672: 1.1 root 3673: static void 3674: toe24 (x, y) 3675: unsigned EMUSHORT *x, *y; 3676: { 3677: unsigned EMUSHORT i; 3678: unsigned EMUSHORT *p; 3679: 3680: #ifdef NANS 3681: if (eiisnan (x)) 3682: { 1.1.1.3 root 3683: make_nan (y, eiisneg (x), SFmode); 1.1 root 3684: return; 3685: } 3686: #endif 3687: p = &x[0]; 1.1.1.4 ! root 3688: #ifdef IEEE ! 3689: if (! REAL_WORDS_BIG_ENDIAN) ! 3690: y += 1; 1.1 root 3691: #endif 3692: #ifdef DEC 3693: y += 1; 3694: #endif 3695: *y = 0; /* output high order */ 3696: if (*p++) 3697: *y = 0x8000; /* output sign bit */ 3698: 3699: i = *p++; 3700: /* Handle overflow cases. */ 3701: if (i >= 255) 3702: { 3703: #ifdef INFINITY 3704: *y |= (unsigned EMUSHORT) 0x7f80; 3705: #ifdef DEC 3706: *(--y) = 0; 3707: #endif 1.1.1.4 ! root 3708: #ifdef IEEE ! 3709: if (! REAL_WORDS_BIG_ENDIAN) ! 3710: *(--y) = 0; ! 3711: else ! 3712: { ! 3713: ++y; ! 3714: *y = 0; ! 3715: } 1.1 root 3716: #endif 3717: #else /* no INFINITY */ 3718: *y |= (unsigned EMUSHORT) 0x7f7f; 3719: #ifdef DEC 3720: *(--y) = 0xffff; 3721: #endif 1.1.1.4 ! root 3722: #ifdef IEEE ! 3723: if (! REAL_WORDS_BIG_ENDIAN) ! 3724: *(--y) = 0xffff; ! 3725: else ! 3726: { ! 3727: ++y; ! 3728: *y = 0xffff; ! 3729: } 1.1 root 3730: #endif 3731: #ifdef ERANGE 3732: errno = ERANGE; 3733: #endif 3734: #endif /* no INFINITY */ 3735: return; 3736: } 3737: if (i == 0) 3738: { 3739: eshift (x, 7); 3740: } 3741: else 3742: { 3743: i <<= 7; 3744: eshift (x, 8); 3745: } 3746: i |= *p++ & (unsigned EMUSHORT) 0x7f; /* *p = xi[M] */ 1.1.1.4 ! root 3747: /* High order output already has sign bit set. */ ! 3748: *y |= i; 1.1 root 3749: #ifdef DEC 3750: *(--y) = *p; 3751: #endif 1.1.1.4 ! root 3752: #ifdef IEEE ! 3753: if (! REAL_WORDS_BIG_ENDIAN) ! 3754: *(--y) = *p; ! 3755: else ! 3756: { ! 3757: ++y; ! 3758: *y = *p; ! 3759: } 1.1 root 3760: #endif 3761: } 1.1.1.2 root 3762: #endif /* not IBM */ 1.1 root 3763: 1.1.1.3 root 3764: /* Compare two e type numbers. 3765: Return +1 if a > b 3766: 0 if a == b 3767: -1 if a < b 3768: -2 if either a or b is a NaN. */ 3769: 3770: static int 1.1 root 3771: ecmp (a, b) 3772: unsigned EMUSHORT *a, *b; 3773: { 3774: unsigned EMUSHORT ai[NI], bi[NI]; 3775: register unsigned EMUSHORT *p, *q; 3776: register int i; 3777: int msign; 3778: 3779: #ifdef NANS 3780: if (eisnan (a) || eisnan (b)) 3781: return (-2); 3782: #endif 3783: emovi (a, ai); 3784: p = ai; 3785: emovi (b, bi); 3786: q = bi; 3787: 3788: if (*p != *q) 3789: { /* the signs are different */ 3790: /* -0 equals + 0 */ 3791: for (i = 1; i < NI - 1; i++) 3792: { 3793: if (ai[i] != 0) 3794: goto nzro; 3795: if (bi[i] != 0) 3796: goto nzro; 3797: } 3798: return (0); 3799: nzro: 3800: if (*p == 0) 3801: return (1); 3802: else 3803: return (-1); 3804: } 3805: /* both are the same sign */ 3806: if (*p == 0) 3807: msign = 1; 3808: else 3809: msign = -1; 3810: i = NI - 1; 3811: do 3812: { 3813: if (*p++ != *q++) 3814: { 3815: goto diff; 3816: } 3817: } 3818: while (--i > 0); 3819: 3820: return (0); /* equality */ 3821: 3822: diff: 3823: 3824: if (*(--p) > *(--q)) 3825: return (msign); /* p is bigger */ 3826: else 3827: return (-msign); /* p is littler */ 3828: } 3829: 1.1.1.4 ! root 3830: /* Find e-type nearest integer to X, as floor (X + 0.5). */ 1.1.1.3 root 3831: 3832: static void 1.1 root 3833: eround (x, y) 3834: unsigned EMUSHORT *x, *y; 3835: { 3836: eadd (ehalf, x, y); 3837: efloor (y, y); 3838: } 3839: 1.1.1.4 ! root 3840: /* Convert HOST_WIDE_INT LP to e type Y. */ 1.1.1.3 root 3841: 3842: static void 1.1 root 3843: ltoe (lp, y) 1.1.1.2 root 3844: HOST_WIDE_INT *lp; 3845: unsigned EMUSHORT *y; 1.1 root 3846: { 3847: unsigned EMUSHORT yi[NI]; 1.1.1.2 root 3848: unsigned HOST_WIDE_INT ll; 1.1 root 3849: int k; 3850: 3851: ecleaz (yi); 3852: if (*lp < 0) 3853: { 3854: /* make it positive */ 1.1.1.2 root 3855: ll = (unsigned HOST_WIDE_INT) (-(*lp)); 1.1 root 3856: yi[0] = 0xffff; /* put correct sign in the e type number */ 3857: } 3858: else 3859: { 1.1.1.2 root 3860: ll = (unsigned HOST_WIDE_INT) (*lp); 1.1 root 3861: } 3862: /* move the long integer to yi significand area */ 1.1.1.2 root 3863: #if HOST_BITS_PER_WIDE_INT == 64 1.1 root 3864: yi[M] = (unsigned EMUSHORT) (ll >> 48); 3865: yi[M + 1] = (unsigned EMUSHORT) (ll >> 32); 3866: yi[M + 2] = (unsigned EMUSHORT) (ll >> 16); 3867: yi[M + 3] = (unsigned EMUSHORT) ll; 3868: yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */ 3869: #else 3870: yi[M] = (unsigned EMUSHORT) (ll >> 16); 3871: yi[M + 1] = (unsigned EMUSHORT) ll; 3872: yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */ 3873: #endif 3874: 3875: if ((k = enormlz (yi)) > NBITS)/* normalize the significand */ 3876: ecleaz (yi); /* it was zero */ 3877: else 3878: yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */ 3879: emovo (yi, y); /* output the answer */ 3880: } 3881: 1.1.1.4 ! root 3882: /* Convert unsigned HOST_WIDE_INT LP to e type Y. */ 1.1.1.3 root 3883: 3884: static void 1.1 root 3885: ultoe (lp, y) 1.1.1.2 root 3886: unsigned HOST_WIDE_INT *lp; 3887: unsigned EMUSHORT *y; 1.1 root 3888: { 3889: unsigned EMUSHORT yi[NI]; 1.1.1.2 root 3890: unsigned HOST_WIDE_INT ll; 1.1 root 3891: int k; 3892: 3893: ecleaz (yi); 3894: ll = *lp; 3895: 3896: /* move the long integer to ayi significand area */ 1.1.1.2 root 3897: #if HOST_BITS_PER_WIDE_INT == 64 1.1 root 3898: yi[M] = (unsigned EMUSHORT) (ll >> 48); 3899: yi[M + 1] = (unsigned EMUSHORT) (ll >> 32); 3900: yi[M + 2] = (unsigned EMUSHORT) (ll >> 16); 3901: yi[M + 3] = (unsigned EMUSHORT) ll; 3902: yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */ 3903: #else 3904: yi[M] = (unsigned EMUSHORT) (ll >> 16); 3905: yi[M + 1] = (unsigned EMUSHORT) ll; 3906: yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */ 3907: #endif 3908: 3909: if ((k = enormlz (yi)) > NBITS)/* normalize the significand */ 3910: ecleaz (yi); /* it was zero */ 3911: else 3912: yi[E] -= (unsigned EMUSHORT) k; /* subtract shift count from exponent */ 3913: emovo (yi, y); /* output the answer */ 3914: } 3915: 3916: 1.1.1.4 ! root 3917: /* Find signed HOST_WIDE_INT integer I and floating point fractional ! 3918: part FRAC of e-type (packed internal format) floating point input X. 1.1.1.3 root 3919: The integer output I has the sign of the input, except that 3920: positive overflow is permitted if FIXUNS_TRUNC_LIKE_FIX_TRUNC. 3921: The output e-type fraction FRAC is the positive fractional 3922: part of abs (X). */ 1.1 root 3923: 1.1.1.3 root 3924: static void 1.1 root 3925: eifrac (x, i, frac) 3926: unsigned EMUSHORT *x; 1.1.1.2 root 3927: HOST_WIDE_INT *i; 1.1 root 3928: unsigned EMUSHORT *frac; 3929: { 3930: unsigned EMUSHORT xi[NI]; 3931: int j, k; 1.1.1.2 root 3932: unsigned HOST_WIDE_INT ll; 1.1 root 3933: 3934: emovi (x, xi); 3935: k = (int) xi[E] - (EXONE - 1); 3936: if (k <= 0) 3937: { 3938: /* if exponent <= 0, integer = 0 and real output is fraction */ 3939: *i = 0L; 3940: emovo (xi, frac); 3941: return; 3942: } 1.1.1.2 root 3943: if (k > (HOST_BITS_PER_WIDE_INT - 1)) 1.1 root 3944: { 3945: /* long integer overflow: output large integer 3946: and correct fraction */ 3947: if (xi[0]) 1.1.1.2 root 3948: *i = ((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1); 1.1 root 3949: else 1.1.1.3 root 3950: { 3951: #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC 3952: /* In this case, let it overflow and convert as if unsigned. */ 3953: euifrac (x, &ll, frac); 3954: *i = (HOST_WIDE_INT) ll; 3955: return; 3956: #else 3957: /* In other cases, return the largest positive integer. */ 3958: *i = (((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1)) - 1; 3959: #endif 3960: } 1.1 root 3961: eshift (xi, k); 3962: if (extra_warnings) 3963: warning ("overflow on truncation to integer"); 3964: } 3965: else if (k > 16) 3966: { 3967: /* Shift more than 16 bits: first shift up k-16 mod 16, 3968: then shift up by 16's. */ 3969: j = k - ((k >> 4) << 4); 3970: eshift (xi, j); 3971: ll = xi[M]; 3972: k -= j; 3973: do 3974: { 3975: eshup6 (xi); 3976: ll = (ll << 16) | xi[M]; 3977: } 3978: while ((k -= 16) > 0); 3979: *i = ll; 3980: if (xi[0]) 3981: *i = -(*i); 3982: } 3983: else 1.1.1.2 root 3984: { 3985: /* shift not more than 16 bits */ 3986: eshift (xi, k); 3987: *i = (HOST_WIDE_INT) xi[M] & 0xffff; 3988: if (xi[0]) 3989: *i = -(*i); 3990: } 1.1 root 3991: xi[0] = 0; 3992: xi[E] = EXONE - 1; 3993: xi[M] = 0; 3994: if ((k = enormlz (xi)) > NBITS) 3995: ecleaz (xi); 3996: else 3997: xi[E] -= (unsigned EMUSHORT) k; 3998: 3999: emovo (xi, frac); 4000: } 4001: 4002: 1.1.1.4 ! root 4003: /* Find unsigned HOST_WIDE_INT integer I and floating point fractional part ! 4004: FRAC of e-type X. A negative input yields integer output = 0 but ! 4005: correct fraction. */ 1.1 root 4006: 1.1.1.3 root 4007: static void 1.1 root 4008: euifrac (x, i, frac) 4009: unsigned EMUSHORT *x; 1.1.1.2 root 4010: unsigned HOST_WIDE_INT *i; 1.1 root 4011: unsigned EMUSHORT *frac; 4012: { 1.1.1.2 root 4013: unsigned HOST_WIDE_INT ll; 1.1 root 4014: unsigned EMUSHORT xi[NI]; 4015: int j, k; 4016: 4017: emovi (x, xi); 4018: k = (int) xi[E] - (EXONE - 1); 4019: if (k <= 0) 4020: { 4021: /* if exponent <= 0, integer = 0 and argument is fraction */ 4022: *i = 0L; 4023: emovo (xi, frac); 4024: return; 4025: } 1.1.1.2 root 4026: if (k > HOST_BITS_PER_WIDE_INT) 1.1 root 4027: { 4028: /* Long integer overflow: output large integer 4029: and correct fraction. 4030: Note, the BSD microvax compiler says that ~(0UL) 4031: is a syntax error. */ 4032: *i = ~(0L); 4033: eshift (xi, k); 4034: if (extra_warnings) 4035: warning ("overflow on truncation to unsigned integer"); 4036: } 4037: else if (k > 16) 4038: { 4039: /* Shift more than 16 bits: first shift up k-16 mod 16, 4040: then shift up by 16's. */ 4041: j = k - ((k >> 4) << 4); 4042: eshift (xi, j); 4043: ll = xi[M]; 4044: k -= j; 4045: do 4046: { 4047: eshup6 (xi); 4048: ll = (ll << 16) | xi[M]; 4049: } 4050: while ((k -= 16) > 0); 4051: *i = ll; 4052: } 4053: else 4054: { 4055: /* shift not more than 16 bits */ 4056: eshift (xi, k); 1.1.1.2 root 4057: *i = (HOST_WIDE_INT) xi[M] & 0xffff; 1.1 root 4058: } 4059: 4060: if (xi[0]) /* A negative value yields unsigned integer 0. */ 4061: *i = 0L; 1.1.1.2 root 4062: 1.1 root 4063: xi[0] = 0; 4064: xi[E] = EXONE - 1; 4065: xi[M] = 0; 4066: if ((k = enormlz (xi)) > NBITS) 4067: ecleaz (xi); 4068: else 4069: xi[E] -= (unsigned EMUSHORT) k; 4070: 4071: emovo (xi, frac); 4072: } 4073: 1.1.1.4 ! root 4074: /* Shift the significand of exploded e-type X up or down by SC bits. */ 1.1.1.3 root 4075: 4076: static int 1.1 root 4077: eshift (x, sc) 4078: unsigned EMUSHORT *x; 4079: int sc; 4080: { 4081: unsigned EMUSHORT lost; 4082: unsigned EMUSHORT *p; 4083: 4084: if (sc == 0) 4085: return (0); 4086: 4087: lost = 0; 4088: p = x + NI - 1; 4089: 4090: if (sc < 0) 4091: { 4092: sc = -sc; 4093: while (sc >= 16) 4094: { 4095: lost |= *p; /* remember lost bits */ 4096: eshdn6 (x); 4097: sc -= 16; 4098: } 4099: 4100: while (sc >= 8) 4101: { 4102: lost |= *p & 0xff; 4103: eshdn8 (x); 4104: sc -= 8; 4105: } 4106: 4107: while (sc > 0) 4108: { 4109: lost |= *p & 1; 4110: eshdn1 (x); 4111: sc -= 1; 4112: } 4113: } 4114: else 4115: { 4116: while (sc >= 16) 4117: { 4118: eshup6 (x); 4119: sc -= 16; 4120: } 4121: 4122: while (sc >= 8) 4123: { 4124: eshup8 (x); 4125: sc -= 8; 4126: } 4127: 4128: while (sc > 0) 4129: { 4130: eshup1 (x); 4131: sc -= 1; 4132: } 4133: } 4134: if (lost) 4135: lost = 1; 4136: return ((int) lost); 4137: } 4138: 1.1.1.4 ! root 4139: /* Shift normalize the significand area of exploded e-type X. ! 4140: Return the shift count (up = positive). */ 1.1.1.3 root 4141: 4142: static int 1.1 root 4143: enormlz (x) 4144: unsigned EMUSHORT x[]; 4145: { 4146: register unsigned EMUSHORT *p; 4147: int sc; 4148: 4149: sc = 0; 4150: p = &x[M]; 4151: if (*p != 0) 4152: goto normdn; 4153: ++p; 4154: if (*p & 0x8000) 4155: return (0); /* already normalized */ 4156: while (*p == 0) 4157: { 4158: eshup6 (x); 4159: sc += 16; 1.1.1.3 root 4160: 1.1 root 4161: /* With guard word, there are NBITS+16 bits available. 1.1.1.3 root 4162: Return true if all are zero. */ 1.1 root 4163: if (sc > NBITS) 4164: return (sc); 4165: } 4166: /* see if high byte is zero */ 4167: while ((*p & 0xff00) == 0) 4168: { 4169: eshup8 (x); 4170: sc += 8; 4171: } 4172: /* now shift 1 bit at a time */ 4173: while ((*p & 0x8000) == 0) 4174: { 4175: eshup1 (x); 4176: sc += 1; 4177: if (sc > NBITS) 4178: { 4179: mtherr ("enormlz", UNDERFLOW); 4180: return (sc); 4181: } 4182: } 4183: return (sc); 4184: 4185: /* Normalize by shifting down out of the high guard word 4186: of the significand */ 4187: normdn: 4188: 4189: if (*p & 0xff00) 4190: { 4191: eshdn8 (x); 4192: sc -= 8; 4193: } 4194: while (*p != 0) 4195: { 4196: eshdn1 (x); 4197: sc -= 1; 4198: 4199: if (sc < -NBITS) 4200: { 4201: mtherr ("enormlz", OVERFLOW); 4202: return (sc); 4203: } 4204: } 4205: return (sc); 4206: } 4207: 1.1.1.4 ! root 4208: /* Powers of ten used in decimal <-> binary conversions. */ 1.1 root 4209: 4210: #define NTEN 12 4211: #define MAXP 4096 4212: 1.1.1.2 root 4213: #if LONG_DOUBLE_TYPE_SIZE == 128 4214: static unsigned EMUSHORT etens[NTEN + 1][NE] = 4215: { 4216: {0x6576, 0x4a92, 0x804a, 0x153f, 4217: 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */ 4218: {0x6a32, 0xce52, 0x329a, 0x28ce, 4219: 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */ 4220: {0x526c, 0x50ce, 0xf18b, 0x3d28, 4221: 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,}, 4222: {0x9c66, 0x58f8, 0xbc50, 0x5c54, 4223: 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,}, 4224: {0x851e, 0xeab7, 0x98fe, 0x901b, 4225: 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,}, 4226: {0x0235, 0x0137, 0x36b1, 0x336c, 4227: 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,}, 4228: {0x50f8, 0x25fb, 0xc76b, 0x6b71, 4229: 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,}, 4230: {0x0000, 0x0000, 0x0000, 0x0000, 4231: 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,}, 4232: {0x0000, 0x0000, 0x0000, 0x0000, 4233: 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,}, 4234: {0x0000, 0x0000, 0x0000, 0x0000, 4235: 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,}, 4236: {0x0000, 0x0000, 0x0000, 0x0000, 4237: 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,}, 4238: {0x0000, 0x0000, 0x0000, 0x0000, 4239: 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,}, 4240: {0x0000, 0x0000, 0x0000, 0x0000, 4241: 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */ 4242: }; 4243: 4244: static unsigned EMUSHORT emtens[NTEN + 1][NE] = 4245: { 4246: {0x2030, 0xcffc, 0xa1c3, 0x8123, 4247: 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */ 4248: {0x8264, 0xd2cb, 0xf2ea, 0x12d4, 4249: 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */ 4250: {0xf53f, 0xf698, 0x6bd3, 0x0158, 4251: 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,}, 4252: {0xe731, 0x04d4, 0xe3f2, 0xd332, 4253: 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,}, 4254: {0xa23e, 0x5308, 0xfefb, 0x1155, 4255: 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,}, 4256: {0xe26d, 0xdbde, 0xd05d, 0xb3f6, 4257: 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,}, 4258: {0x2a20, 0x6224, 0x47b3, 0x98d7, 4259: 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,}, 4260: {0x0b5b, 0x4af2, 0xa581, 0x18ed, 4261: 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,}, 4262: {0xbf71, 0xa9b3, 0x7989, 0xbe68, 4263: 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,}, 4264: {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b, 4265: 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,}, 4266: {0xc155, 0xa4a8, 0x404e, 0x6113, 4267: 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,}, 4268: {0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 4269: 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,}, 4270: {0xcccd, 0xcccc, 0xcccc, 0xcccc, 4271: 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */ 4272: }; 4273: #else 4274: /* LONG_DOUBLE_TYPE_SIZE is other than 128 */ 1.1 root 4275: static unsigned EMUSHORT etens[NTEN + 1][NE] = 4276: { 4277: {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */ 4278: {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */ 4279: {0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,}, 4280: {0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,}, 4281: {0xddbc, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,}, 4282: {0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,}, 4283: {0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,}, 4284: {0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,}, 4285: {0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,}, 4286: {0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,}, 4287: {0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,}, 4288: {0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,}, 4289: {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */ 4290: }; 4291: 4292: static unsigned EMUSHORT emtens[NTEN + 1][NE] = 4293: { 4294: {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */ 4295: {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */ 4296: {0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,}, 4297: {0x7133, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,}, 4298: {0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,}, 4299: {0xac7d, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,}, 4300: {0x3f24, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,}, 4301: {0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,}, 4302: {0x4c2f, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,}, 4303: {0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,}, 4304: {0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,}, 4305: {0x3d71, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,}, 4306: {0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */ 4307: }; 1.1.1.2 root 4308: #endif 1.1 root 4309: 1.1.1.4 ! root 4310: /* Convert float value X to ASCII string STRING with NDIG digits after ! 4311: the decimal point. */ ! 4312: 1.1.1.3 root 4313: static void 1.1 root 4314: e24toasc (x, string, ndigs) 4315: unsigned EMUSHORT x[]; 4316: char *string; 4317: int ndigs; 4318: { 4319: unsigned EMUSHORT w[NI]; 4320: 4321: e24toe (x, w); 4322: etoasc (w, string, ndigs); 4323: } 4324: 1.1.1.4 ! root 4325: /* Convert double value X to ASCII string STRING with NDIG digits after ! 4326: the decimal point. */ 1.1 root 4327: 1.1.1.3 root 4328: static void 1.1 root 4329: e53toasc (x, string, ndigs) 4330: unsigned EMUSHORT x[]; 4331: char *string; 4332: int ndigs; 4333: { 4334: unsigned EMUSHORT w[NI]; 4335: 4336: e53toe (x, w); 4337: etoasc (w, string, ndigs); 4338: } 4339: 1.1.1.4 ! root 4340: /* Convert double extended value X to ASCII string STRING with NDIG digits ! 4341: after the decimal point. */ 1.1 root 4342: 1.1.1.3 root 4343: static void 1.1 root 4344: e64toasc (x, string, ndigs) 4345: unsigned EMUSHORT x[]; 4346: char *string; 4347: int ndigs; 4348: { 4349: unsigned EMUSHORT w[NI]; 4350: 4351: e64toe (x, w); 4352: etoasc (w, string, ndigs); 4353: } 4354: 1.1.1.4 ! root 4355: /* Convert 128-bit long double value X to ASCII string STRING with NDIG digits ! 4356: after the decimal point. */ ! 4357: 1.1.1.3 root 4358: static void 1.1.1.2 root 4359: e113toasc (x, string, ndigs) 4360: unsigned EMUSHORT x[]; 4361: char *string; 4362: int ndigs; 4363: { 4364: unsigned EMUSHORT w[NI]; 4365: 4366: e113toe (x, w); 4367: etoasc (w, string, ndigs); 4368: } 4369: 1.1.1.4 ! root 4370: /* Convert e-type X to ASCII string STRING with NDIGS digits after ! 4371: the decimal point. */ 1.1 root 4372: 4373: static char wstring[80]; /* working storage for ASCII output */ 4374: 1.1.1.3 root 4375: static void 1.1 root 4376: etoasc (x, string, ndigs) 4377: unsigned EMUSHORT x[]; 4378: char *string; 4379: int ndigs; 4380: { 4381: EMUSHORT digit; 4382: unsigned EMUSHORT y[NI], t[NI], u[NI], w[NI]; 4383: unsigned EMUSHORT *p, *r, *ten; 4384: unsigned EMUSHORT sign; 4385: int i, j, k, expon, rndsav; 4386: char *s, *ss; 4387: unsigned EMUSHORT m; 4388: 4389: 4390: rndsav = rndprc; 4391: ss = string; 4392: s = wstring; 4393: *ss = '\0'; 4394: *s = '\0'; 4395: #ifdef NANS 4396: if (eisnan (x)) 4397: { 4398: sprintf (wstring, " NaN "); 4399: goto bxit; 4400: } 4401: #endif 4402: rndprc = NBITS; /* set to full precision */ 4403: emov (x, y); /* retain external format */ 4404: if (y[NE - 1] & 0x8000) 4405: { 4406: sign = 0xffff; 4407: y[NE - 1] &= 0x7fff; 4408: } 4409: else 4410: { 4411: sign = 0; 4412: } 4413: expon = 0; 4414: ten = &etens[NTEN][0]; 4415: emov (eone, t); 4416: /* Test for zero exponent */ 4417: if (y[NE - 1] == 0) 4418: { 4419: for (k = 0; k < NE - 1; k++) 4420: { 4421: if (y[k] != 0) 4422: goto tnzro; /* denormalized number */ 4423: } 1.1.1.4 ! root 4424: goto isone; /* valid all zeros */ 1.1 root 4425: } 4426: tnzro: 4427: 4428: /* Test for infinity. */ 4429: if (y[NE - 1] == 0x7fff) 4430: { 4431: if (sign) 4432: sprintf (wstring, " -Infinity "); 4433: else 4434: sprintf (wstring, " Infinity "); 4435: goto bxit; 4436: } 4437: 4438: /* Test for exponent nonzero but significand denormalized. 4439: * This is an error condition. 4440: */ 4441: if ((y[NE - 1] != 0) && ((y[NE - 2] & 0x8000) == 0)) 4442: { 4443: mtherr ("etoasc", DOMAIN); 4444: sprintf (wstring, "NaN"); 4445: goto bxit; 4446: } 4447: 4448: /* Compare to 1.0 */ 4449: i = ecmp (eone, y); 4450: if (i == 0) 4451: goto isone; 4452: 4453: if (i == -2) 4454: abort (); 4455: 4456: if (i < 0) 4457: { /* Number is greater than 1 */ 4458: /* Convert significand to an integer and strip trailing decimal zeros. */ 4459: emov (y, u); 4460: u[NE - 1] = EXONE + NBITS - 1; 4461: 4462: p = &etens[NTEN - 4][0]; 4463: m = 16; 4464: do 4465: { 4466: ediv (p, u, t); 4467: efloor (t, w); 4468: for (j = 0; j < NE - 1; j++) 4469: { 4470: if (t[j] != w[j]) 4471: goto noint; 4472: } 4473: emov (t, u); 4474: expon += (int) m; 4475: noint: 4476: p += NE; 4477: m >>= 1; 4478: } 4479: while (m != 0); 4480: 4481: /* Rescale from integer significand */ 4482: u[NE - 1] += y[NE - 1] - (unsigned int) (EXONE + NBITS - 1); 4483: emov (u, y); 4484: /* Find power of 10 */ 4485: emov (eone, t); 4486: m = MAXP; 4487: p = &etens[0][0]; 4488: /* An unordered compare result shouldn't happen here. */ 4489: while (ecmp (ten, u) <= 0) 4490: { 4491: if (ecmp (p, u) <= 0) 4492: { 4493: ediv (p, u, u); 4494: emul (p, t, t); 4495: expon += (int) m; 4496: } 4497: m >>= 1; 4498: if (m == 0) 4499: break; 4500: p += NE; 4501: } 4502: } 4503: else 4504: { /* Number is less than 1.0 */ 4505: /* Pad significand with trailing decimal zeros. */ 4506: if (y[NE - 1] == 0) 4507: { 4508: while ((y[NE - 2] & 0x8000) == 0) 4509: { 4510: emul (ten, y, y); 4511: expon -= 1; 4512: } 4513: } 4514: else 4515: { 4516: emovi (y, w); 4517: for (i = 0; i < NDEC + 1; i++) 4518: { 4519: if ((w[NI - 1] & 0x7) != 0) 4520: break; 4521: /* multiply by 10 */ 4522: emovz (w, u); 4523: eshdn1 (u); 4524: eshdn1 (u); 4525: eaddm (w, u); 4526: u[1] += 3; 4527: while (u[2] != 0) 4528: { 4529: eshdn1 (u); 4530: u[1] += 1; 4531: } 4532: if (u[NI - 1] != 0) 4533: break; 4534: if (eone[NE - 1] <= u[1]) 4535: break; 4536: emovz (u, w); 4537: expon -= 1; 4538: } 4539: emovo (w, y); 4540: } 4541: k = -MAXP; 4542: p = &emtens[0][0]; 4543: r = &etens[0][0]; 4544: emov (y, w); 4545: emov (eone, t); 4546: while (ecmp (eone, w) > 0) 4547: { 4548: if (ecmp (p, w) >= 0) 4549: { 4550: emul (r, w, w); 4551: emul (r, t, t); 4552: expon += k; 4553: } 4554: k /= 2; 4555: if (k == 0) 4556: break; 4557: p += NE; 4558: r += NE; 4559: } 4560: ediv (t, eone, t); 4561: } 4562: isone: 4563: /* Find the first (leading) digit. */ 4564: emovi (t, w); 4565: emovz (w, t); 4566: emovi (y, w); 4567: emovz (w, y); 4568: eiremain (t, y); 4569: digit = equot[NI - 1]; 4570: while ((digit == 0) && (ecmp (y, ezero) != 0)) 4571: { 4572: eshup1 (y); 4573: emovz (y, u); 4574: eshup1 (u); 4575: eshup1 (u); 4576: eaddm (u, y); 4577: eiremain (t, y); 4578: digit = equot[NI - 1]; 4579: expon -= 1; 4580: } 4581: s = wstring; 4582: if (sign) 4583: *s++ = '-'; 4584: else 4585: *s++ = ' '; 4586: /* Examine number of digits requested by caller. */ 4587: if (ndigs < 0) 4588: ndigs = 0; 4589: if (ndigs > NDEC) 4590: ndigs = NDEC; 4591: if (digit == 10) 4592: { 4593: *s++ = '1'; 4594: *s++ = '.'; 4595: if (ndigs > 0) 4596: { 4597: *s++ = '0'; 4598: ndigs -= 1; 4599: } 4600: expon += 1; 4601: } 4602: else 4603: { 1.1.1.2 root 4604: *s++ = (char)digit + '0'; 1.1 root 4605: *s++ = '.'; 4606: } 4607: /* Generate digits after the decimal point. */ 4608: for (k = 0; k <= ndigs; k++) 4609: { 4610: /* multiply current number by 10, without normalizing */ 4611: eshup1 (y); 4612: emovz (y, u); 4613: eshup1 (u); 4614: eshup1 (u); 4615: eaddm (u, y); 4616: eiremain (t, y); 4617: *s++ = (char) equot[NI - 1] + '0'; 4618: } 4619: digit = equot[NI - 1]; 4620: --s; 4621: ss = s; 4622: /* round off the ASCII string */ 4623: if (digit > 4) 4624: { 4625: /* Test for critical rounding case in ASCII output. */ 4626: if (digit == 5) 4627: { 4628: emovo (y, t); 4629: if (ecmp (t, ezero) != 0) 4630: goto roun; /* round to nearest */ 4631: if ((*(s - 1) & 1) == 0) 4632: goto doexp; /* round to even */ 4633: } 4634: /* Round up and propagate carry-outs */ 4635: roun: 4636: --s; 4637: k = *s & 0x7f; 4638: /* Carry out to most significant digit? */ 4639: if (k == '.') 4640: { 4641: --s; 4642: k = *s; 4643: k += 1; 4644: *s = (char) k; 4645: /* Most significant digit carries to 10? */ 4646: if (k > '9') 4647: { 4648: expon += 1; 4649: *s = '1'; 4650: } 4651: goto doexp; 4652: } 4653: /* Round up and carry out from less significant digits */ 4654: k += 1; 4655: *s = (char) k; 4656: if (k > '9') 4657: { 4658: *s = '0'; 4659: goto roun; 4660: } 4661: } 4662: doexp: 4663: /* 4664: if (expon >= 0) 4665: sprintf (ss, "e+%d", expon); 4666: else 4667: sprintf (ss, "e%d", expon); 4668: */ 4669: sprintf (ss, "e%d", expon); 4670: bxit: 4671: rndprc = rndsav; 4672: /* copy out the working string */ 4673: s = string; 4674: ss = wstring; 4675: while (*ss == ' ') /* strip possible leading space */ 4676: ++ss; 4677: while ((*s++ = *ss++) != '\0') 4678: ; 4679: } 4680: 4681: 1.1.1.4 ! root 4682: /* Convert ASCII string to floating point. 1.1 root 4683: 1.1.1.4 ! root 4684: Numeric input is a free format decimal number of any length, with ! 4685: or without decimal point. Entering E after the number followed by an ! 4686: integer number causes the second number to be interpreted as a power of ! 4687: 10 to be multiplied by the first number (i.e., "scientific" notation). */ 1.1 root 4688: 1.1.1.4 ! root 4689: /* Convert ASCII string S to single precision float value Y. */ 1.1.1.3 root 4690: 4691: static void 1.1 root 4692: asctoe24 (s, y) 4693: char *s; 4694: unsigned EMUSHORT *y; 4695: { 4696: asctoeg (s, y, 24); 4697: } 4698: 4699: 1.1.1.4 ! root 4700: /* Convert ASCII string S to double precision value Y. */ 1.1.1.3 root 4701: 4702: static void 1.1 root 4703: asctoe53 (s, y) 4704: char *s; 4705: unsigned EMUSHORT *y; 4706: { 1.1.1.2 root 4707: #if defined(DEC) || defined(IBM) 1.1 root 4708: asctoeg (s, y, 56); 4709: #else 4710: asctoeg (s, y, 53); 4711: #endif 4712: } 4713: 4714: 1.1.1.4 ! root 4715: /* Convert ASCII string S to double extended value Y. */ 1.1.1.3 root 4716: 4717: static void 1.1 root 4718: asctoe64 (s, y) 4719: char *s; 4720: unsigned EMUSHORT *y; 4721: { 4722: asctoeg (s, y, 64); 4723: } 4724: 1.1.1.4 ! root 4725: /* Convert ASCII string S to 128-bit long double Y. */ 1.1.1.3 root 4726: 4727: static void 1.1.1.2 root 4728: asctoe113 (s, y) 4729: char *s; 4730: unsigned EMUSHORT *y; 4731: { 4732: asctoeg (s, y, 113); 4733: } 4734: 1.1.1.4 ! root 4735: /* Convert ASCII string S to e type Y. */ 1.1.1.3 root 4736: 4737: static void 1.1 root 4738: asctoe (s, y) 4739: char *s; 4740: unsigned EMUSHORT *y; 4741: { 4742: asctoeg (s, y, NBITS); 4743: } 4744: 1.1.1.4 ! root 4745: /* Convert ASCII string SS to e type Y, with a specified rounding precision ! 4746: of OPREC bits. */ 1.1.1.3 root 4747: 4748: static void 1.1 root 4749: asctoeg (ss, y, oprec) 4750: char *ss; 4751: unsigned EMUSHORT *y; 4752: int oprec; 4753: { 4754: unsigned EMUSHORT yy[NI], xt[NI], tt[NI]; 4755: int esign, decflg, sgnflg, nexp, exp, prec, lost; 4756: int k, trail, c, rndsav; 4757: EMULONG lexp; 4758: unsigned EMUSHORT nsign, *p; 1.1.1.2 root 4759: char *sp, *s, *lstr; 1.1 root 4760: 4761: /* Copy the input string. */ 1.1.1.2 root 4762: lstr = (char *) alloca (strlen (ss) + 1); 1.1 root 4763: s = ss; 4764: while (*s == ' ') /* skip leading spaces */ 4765: ++s; 4766: sp = lstr; 1.1.1.2 root 4767: while ((*sp++ = *s++) != '\0') 4768: ; 1.1 root 4769: s = lstr; 4770: 4771: rndsav = rndprc; 4772: rndprc = NBITS; /* Set to full precision */ 4773: lost = 0; 4774: nsign = 0; 4775: decflg = 0; 4776: sgnflg = 0; 4777: nexp = 0; 4778: exp = 0; 4779: prec = 0; 4780: ecleaz (yy); 4781: trail = 0; 4782: 4783: nxtcom: 4784: k = *s - '0'; 4785: if ((k >= 0) && (k <= 9)) 4786: { 4787: /* Ignore leading zeros */ 4788: if ((prec == 0) && (decflg == 0) && (k == 0)) 4789: goto donchr; 4790: /* Identify and strip trailing zeros after the decimal point. */ 4791: if ((trail == 0) && (decflg != 0)) 4792: { 4793: sp = s; 4794: while ((*sp >= '0') && (*sp <= '9')) 4795: ++sp; 4796: /* Check for syntax error */ 4797: c = *sp & 0x7f; 4798: if ((c != 'e') && (c != 'E') && (c != '\0') 4799: && (c != '\n') && (c != '\r') && (c != ' ') 4800: && (c != ',')) 4801: goto error; 4802: --sp; 4803: while (*sp == '0') 4804: *sp-- = 'z'; 4805: trail = 1; 4806: if (*s == 'z') 4807: goto donchr; 4808: } 1.1.1.3 root 4809: 1.1 root 4810: /* If enough digits were given to more than fill up the yy register, 1.1.1.3 root 4811: continuing until overflow into the high guard word yy[2] 4812: guarantees that there will be a roundoff bit at the top 4813: of the low guard word after normalization. */ 4814: 1.1 root 4815: if (yy[2] == 0) 4816: { 4817: if (decflg) 4818: nexp += 1; /* count digits after decimal point */ 4819: eshup1 (yy); /* multiply current number by 10 */ 4820: emovz (yy, xt); 4821: eshup1 (xt); 4822: eshup1 (xt); 4823: eaddm (xt, yy); 4824: ecleaz (xt); 4825: xt[NI - 2] = (unsigned EMUSHORT) k; 4826: eaddm (xt, yy); 4827: } 4828: else 4829: { 1.1.1.2 root 4830: /* Mark any lost non-zero digit. */ 1.1 root 4831: lost |= k; 1.1.1.2 root 4832: /* Count lost digits before the decimal point. */ 4833: if (decflg == 0) 4834: nexp -= 1; 1.1 root 4835: } 4836: prec += 1; 4837: goto donchr; 4838: } 4839: 4840: switch (*s) 4841: { 4842: case 'z': 4843: break; 4844: case 'E': 4845: case 'e': 4846: goto expnt; 4847: case '.': /* decimal point */ 4848: if (decflg) 4849: goto error; 4850: ++decflg; 4851: break; 4852: case '-': 4853: nsign = 0xffff; 4854: if (sgnflg) 4855: goto error; 4856: ++sgnflg; 4857: break; 4858: case '+': 4859: if (sgnflg) 4860: goto error; 4861: ++sgnflg; 4862: break; 4863: case ',': 4864: case ' ': 4865: case '\0': 4866: case '\n': 4867: case '\r': 4868: goto daldone; 4869: case 'i': 4870: case 'I': 4871: goto infinite; 4872: default: 4873: error: 4874: #ifdef NANS 4875: einan (yy); 4876: #else 4877: mtherr ("asctoe", DOMAIN); 4878: eclear (yy); 4879: #endif 4880: goto aexit; 4881: } 4882: donchr: 4883: ++s; 4884: goto nxtcom; 4885: 4886: /* Exponent interpretation */ 4887: expnt: 4888: 4889: esign = 1; 4890: exp = 0; 4891: ++s; 4892: /* check for + or - */ 4893: if (*s == '-') 4894: { 4895: esign = -1; 4896: ++s; 4897: } 4898: if (*s == '+') 4899: ++s; 4900: while ((*s >= '0') && (*s <= '9')) 4901: { 4902: exp *= 10; 4903: exp += *s++ - '0'; 1.1.1.2 root 4904: if (exp > -(MINDECEXP)) 1.1 root 4905: { 4906: if (esign < 0) 4907: goto zero; 4908: else 4909: goto infinite; 4910: } 4911: } 4912: if (esign < 0) 4913: exp = -exp; 1.1.1.2 root 4914: if (exp > MAXDECEXP) 1.1 root 4915: { 4916: infinite: 4917: ecleaz (yy); 4918: yy[E] = 0x7fff; /* infinity */ 4919: goto aexit; 4920: } 1.1.1.2 root 4921: if (exp < MINDECEXP) 1.1 root 4922: { 4923: zero: 4924: ecleaz (yy); 4925: goto aexit; 4926: } 4927: 4928: daldone: 4929: nexp = exp - nexp; 4930: /* Pad trailing zeros to minimize power of 10, per IEEE spec. */ 4931: while ((nexp > 0) && (yy[2] == 0)) 4932: { 4933: emovz (yy, xt); 4934: eshup1 (xt); 4935: eshup1 (xt); 4936: eaddm (yy, xt); 4937: eshup1 (xt); 4938: if (xt[2] != 0) 4939: break; 4940: nexp -= 1; 4941: emovz (xt, yy); 4942: } 4943: if ((k = enormlz (yy)) > NBITS) 4944: { 4945: ecleaz (yy); 4946: goto aexit; 4947: } 4948: lexp = (EXONE - 1 + NBITS) - k; 4949: emdnorm (yy, lost, 0, lexp, 64); 4950: 1.1.1.3 root 4951: /* Convert to external format: 4952: 4953: Multiply by 10**nexp. If precision is 64 bits, 4954: the maximum relative error incurred in forming 10**n 4955: for 0 <= n <= 324 is 8.2e-20, at 10**180. 4956: For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947. 4957: For 0 >= n >= -999, it is -1.55e-19 at 10**-435. */ 1.1 root 4958: 4959: lexp = yy[E]; 4960: if (nexp == 0) 4961: { 4962: k = 0; 4963: goto expdon; 4964: } 4965: esign = 1; 4966: if (nexp < 0) 4967: { 4968: nexp = -nexp; 4969: esign = -1; 4970: if (nexp > 4096) 1.1.1.3 root 4971: { 4972: /* Punt. Can't handle this without 2 divides. */ 1.1 root 4973: emovi (etens[0], tt); 4974: lexp -= tt[E]; 4975: k = edivm (tt, yy); 4976: lexp += EXONE; 4977: nexp -= 4096; 4978: } 4979: } 4980: p = &etens[NTEN][0]; 4981: emov (eone, xt); 4982: exp = 1; 4983: do 4984: { 4985: if (exp & nexp) 4986: emul (p, xt, xt); 4987: p -= NE; 4988: exp = exp + exp; 4989: } 4990: while (exp <= MAXP); 4991: 4992: emovi (xt, tt); 4993: if (esign < 0) 4994: { 4995: lexp -= tt[E]; 4996: k = edivm (tt, yy); 4997: lexp += EXONE; 4998: } 4999: else 5000: { 5001: lexp += tt[E]; 5002: k = emulm (tt, yy); 5003: lexp -= EXONE - 1; 5004: } 5005: 5006: expdon: 5007: 5008: /* Round and convert directly to the destination type */ 5009: if (oprec == 53) 5010: lexp -= EXONE - 0x3ff; 1.1.1.2 root 5011: #ifdef IBM 5012: else if (oprec == 24 || oprec == 56) 5013: lexp -= EXONE - (0x41 << 2); 5014: #else 1.1 root 5015: else if (oprec == 24) 5016: lexp -= EXONE - 0177; 1.1.1.2 root 5017: #endif 1.1 root 5018: #ifdef DEC 5019: else if (oprec == 56) 5020: lexp -= EXONE - 0201; 5021: #endif 5022: rndprc = oprec; 5023: emdnorm (yy, k, 0, lexp, 64); 5024: 5025: aexit: 5026: 5027: rndprc = rndsav; 5028: yy[0] = nsign; 5029: switch (oprec) 5030: { 5031: #ifdef DEC 5032: case 56: 5033: todec (yy, y); /* see etodec.c */ 5034: break; 5035: #endif 1.1.1.2 root 5036: #ifdef IBM 5037: case 56: 5038: toibm (yy, y, DFmode); 5039: break; 5040: #endif 1.1 root 5041: case 53: 5042: toe53 (yy, y); 5043: break; 5044: case 24: 5045: toe24 (yy, y); 5046: break; 5047: case 64: 5048: toe64 (yy, y); 5049: break; 1.1.1.2 root 5050: case 113: 5051: toe113 (yy, y); 5052: break; 1.1 root 5053: case NBITS: 5054: emovo (yy, y); 5055: break; 5056: } 5057: } 5058: 5059: 5060: 1.1.1.4 ! root 5061: /* Return Y = largest integer not greater than X (truncated toward minus ! 5062: infinity). */ 1.1.1.3 root 5063: 1.1 root 5064: static unsigned EMUSHORT bmask[] = 5065: { 5066: 0xffff, 5067: 0xfffe, 5068: 0xfffc, 5069: 0xfff8, 5070: 0xfff0, 5071: 0xffe0, 5072: 0xffc0, 5073: 0xff80, 5074: 0xff00, 5075: 0xfe00, 5076: 0xfc00, 5077: 0xf800, 5078: 0xf000, 5079: 0xe000, 5080: 0xc000, 5081: 0x8000, 5082: 0x0000, 5083: }; 5084: 1.1.1.3 root 5085: static void 1.1 root 5086: efloor (x, y) 5087: unsigned EMUSHORT x[], y[]; 5088: { 5089: register unsigned EMUSHORT *p; 5090: int e, expon, i; 5091: unsigned EMUSHORT f[NE]; 5092: 5093: emov (x, f); /* leave in external format */ 5094: expon = (int) f[NE - 1]; 5095: e = (expon & 0x7fff) - (EXONE - 1); 5096: if (e <= 0) 5097: { 5098: eclear (y); 5099: goto isitneg; 5100: } 5101: /* number of bits to clear out */ 5102: e = NBITS - e; 5103: emov (f, y); 5104: if (e <= 0) 5105: return; 5106: 5107: p = &y[0]; 5108: while (e >= 16) 5109: { 5110: *p++ = 0; 5111: e -= 16; 5112: } 5113: /* clear the remaining bits */ 5114: *p &= bmask[e]; 5115: /* truncate negatives toward minus infinity */ 5116: isitneg: 5117: 5118: if ((unsigned EMUSHORT) expon & (unsigned EMUSHORT) 0x8000) 5119: { 5120: for (i = 0; i < NE - 1; i++) 5121: { 5122: if (f[i] != y[i]) 5123: { 5124: esub (eone, y, y); 5125: break; 5126: } 5127: } 5128: } 5129: } 5130: 5131: 1.1.1.4 ! root 5132: /* Return S and EXP such that S * 2^EXP = X and .5 <= S < 1. ! 5133: For example, 1.1 = 0.55 * 2^1. */ 1.1.1.3 root 5134: 5135: static void 1.1 root 5136: efrexp (x, exp, s) 5137: unsigned EMUSHORT x[]; 5138: int *exp; 5139: unsigned EMUSHORT s[]; 5140: { 5141: unsigned EMUSHORT xi[NI]; 5142: EMULONG li; 5143: 5144: emovi (x, xi); 1.1.1.4 ! root 5145: /* Handle denormalized numbers properly using long integer exponent. */ 1.1 root 5146: li = (EMULONG) ((EMUSHORT) xi[1]); 5147: 5148: if (li == 0) 5149: { 5150: li -= enormlz (xi); 5151: } 5152: xi[1] = 0x3ffe; 5153: emovo (xi, s); 5154: *exp = (int) (li - 0x3ffe); 5155: } 5156: 1.1.1.4 ! root 5157: /* Return e type Y = X * 2^PWR2. */ 1.1.1.3 root 5158: 5159: static void 1.1 root 5160: eldexp (x, pwr2, y) 5161: unsigned EMUSHORT x[]; 5162: int pwr2; 5163: unsigned EMUSHORT y[]; 5164: { 5165: unsigned EMUSHORT xi[NI]; 5166: EMULONG li; 5167: int i; 5168: 5169: emovi (x, xi); 5170: li = xi[1]; 5171: li += pwr2; 5172: i = 0; 5173: emdnorm (xi, i, i, li, 64); 5174: emovo (xi, y); 5175: } 5176: 5177: 1.1.1.4 ! root 5178: /* C = remainder after dividing B by A, all e type values. ! 5179: Least significant integer quotient bits left in EQUOT. */ 1.1.1.3 root 5180: 5181: static void 1.1 root 5182: eremain (a, b, c) 5183: unsigned EMUSHORT a[], b[], c[]; 5184: { 5185: unsigned EMUSHORT den[NI], num[NI]; 5186: 5187: #ifdef NANS 1.1.1.2 root 5188: if (eisinf (b) 5189: || (ecmp (a, ezero) == 0) 5190: || eisnan (a) 5191: || eisnan (b)) 1.1 root 5192: { 1.1.1.3 root 5193: enan (c, 0); 1.1 root 5194: return; 5195: } 5196: #endif 5197: if (ecmp (a, ezero) == 0) 5198: { 5199: mtherr ("eremain", SING); 5200: eclear (c); 5201: return; 5202: } 5203: emovi (a, den); 5204: emovi (b, num); 5205: eiremain (den, num); 5206: /* Sign of remainder = sign of quotient */ 5207: if (a[0] == b[0]) 5208: num[0] = 0; 5209: else 5210: num[0] = 0xffff; 5211: emovo (num, c); 5212: } 5213: 1.1.1.4 ! root 5214: /* Return quotient of exploded e-types NUM / DEN in EQUOT, ! 5215: remainder in NUM. */ ! 5216: 1.1.1.3 root 5217: static void 1.1 root 5218: eiremain (den, num) 5219: unsigned EMUSHORT den[], num[]; 5220: { 5221: EMULONG ld, ln; 5222: unsigned EMUSHORT j; 5223: 5224: ld = den[E]; 5225: ld -= enormlz (den); 5226: ln = num[E]; 5227: ln -= enormlz (num); 5228: ecleaz (equot); 5229: while (ln >= ld) 5230: { 5231: if (ecmpm (den, num) <= 0) 5232: { 5233: esubm (den, num); 5234: j = 1; 5235: } 5236: else 5237: j = 0; 5238: eshup1 (equot); 5239: equot[NI - 1] |= j; 5240: eshup1 (num); 5241: ln -= 1; 5242: } 5243: emdnorm (num, 0, 0, ln, 0); 5244: } 5245: 1.1.1.4 ! root 5246: /* Report an error condition CODE encountered in function NAME. ! 5247: CODE is one of the following: 1.1 root 5248: 1.1.1.3 root 5249: Mnemonic Value Significance 5250: 5251: DOMAIN 1 argument domain error 5252: SING 2 function singularity 5253: OVERFLOW 3 overflow range error 5254: UNDERFLOW 4 underflow range error 5255: TLOSS 5 total loss of precision 5256: PLOSS 6 partial loss of precision 5257: INVALID 7 NaN - producing operation 5258: EDOM 33 Unix domain error code 5259: ERANGE 34 Unix range error code 5260: 1.1.1.4 ! root 5261: The order of appearance of the following messages is bound to the 1.1.1.3 root 5262: error codes defined above. */ 1.1 root 5263: 5264: #define NMSGS 8 5265: static char *ermsg[NMSGS] = 5266: { 5267: "unknown", /* error code 0 */ 5268: "domain", /* error code 1 */ 5269: "singularity", /* et seq. */ 5270: "overflow", 5271: "underflow", 5272: "total loss of precision", 5273: "partial loss of precision", 5274: "invalid operation" 5275: }; 5276: 5277: int merror = 0; 5278: extern int merror; 5279: 1.1.1.3 root 5280: static void 1.1 root 5281: mtherr (name, code) 5282: char *name; 5283: int code; 5284: { 5285: char errstr[80]; 5286: 1.1.1.4 ! root 5287: /* The string passed by the calling program is supposed to be the 1.1.1.3 root 5288: name of the function in which the error occurred. 1.1.1.4 ! root 5289: The code argument selects which error message string will be printed. */ 1.1 root 5290: 5291: if ((code <= 0) || (code >= NMSGS)) 5292: code = 0; 5293: sprintf (errstr, " %s %s error", name, ermsg[code]); 5294: if (extra_warnings) 5295: warning (errstr); 5296: /* Set global error message word */ 5297: merror = code + 1; 5298: } 5299: 1.1.1.2 root 5300: #ifdef DEC 1.1.1.4 ! root 5301: /* Convert DEC double precision D to e type E. */ 1.1 root 5302: 1.1.1.3 root 5303: static void 1.1 root 5304: dectoe (d, e) 5305: unsigned EMUSHORT *d; 5306: unsigned EMUSHORT *e; 5307: { 5308: unsigned EMUSHORT y[NI]; 5309: register unsigned EMUSHORT r, *p; 5310: 5311: ecleaz (y); /* start with a zero */ 5312: p = y; /* point to our number */ 5313: r = *d; /* get DEC exponent word */ 5314: if (*d & (unsigned int) 0x8000) 5315: *p = 0xffff; /* fill in our sign */ 5316: ++p; /* bump pointer to our exponent word */ 5317: r &= 0x7fff; /* strip the sign bit */ 5318: if (r == 0) /* answer = 0 if high order DEC word = 0 */ 5319: goto done; 5320: 5321: 5322: r >>= 7; /* shift exponent word down 7 bits */ 5323: r += EXONE - 0201; /* subtract DEC exponent offset */ 5324: /* add our e type exponent offset */ 5325: *p++ = r; /* to form our exponent */ 5326: 5327: r = *d++; /* now do the high order mantissa */ 5328: r &= 0177; /* strip off the DEC exponent and sign bits */ 5329: r |= 0200; /* the DEC understood high order mantissa bit */ 5330: *p++ = r; /* put result in our high guard word */ 5331: 5332: *p++ = *d++; /* fill in the rest of our mantissa */ 5333: *p++ = *d++; 5334: *p = *d; 5335: 5336: eshdn8 (y); /* shift our mantissa down 8 bits */ 5337: done: 5338: emovo (y, e); 5339: } 5340: 1.1.1.4 ! root 5341: /* Convert e type X to DEC double precision D. */ 1.1 root 5342: 1.1.1.3 root 5343: static void 1.1 root 5344: etodec (x, d) 5345: unsigned EMUSHORT *x, *d; 5346: { 5347: unsigned EMUSHORT xi[NI]; 1.1.1.2 root 5348: EMULONG exp; 5349: int rndsav; 1.1 root 5350: 5351: emovi (x, xi); 1.1.1.4 ! root 5352: /* Adjust exponent for offsets. */ ! 5353: exp = (EMULONG) xi[E] - (EXONE - 0201); ! 5354: /* Round off to nearest or even. */ 1.1.1.2 root 5355: rndsav = rndprc; 5356: rndprc = 56; 5357: emdnorm (xi, 0, 0, exp, 64); 5358: rndprc = rndsav; 5359: todec (xi, d); 1.1 root 5360: } 5361: 1.1.1.4 ! root 5362: /* Convert exploded e-type X, that has already been rounded to ! 5363: 56-bit precision, to DEC format double Y. */ ! 5364: 1.1.1.3 root 5365: static void 1.1 root 5366: todec (x, y) 5367: unsigned EMUSHORT *x, *y; 5368: { 5369: unsigned EMUSHORT i; 5370: unsigned EMUSHORT *p; 5371: 5372: p = x; 5373: *y = 0; 5374: if (*p++) 5375: *y = 0100000; 5376: i = *p++; 5377: if (i == 0) 5378: { 5379: *y++ = 0; 5380: *y++ = 0; 5381: *y++ = 0; 5382: *y++ = 0; 5383: return; 5384: } 5385: if (i > 0377) 5386: { 5387: *y++ |= 077777; 5388: *y++ = 0xffff; 5389: *y++ = 0xffff; 5390: *y++ = 0xffff; 5391: #ifdef ERANGE 5392: errno = ERANGE; 5393: #endif 5394: return; 5395: } 5396: i &= 0377; 5397: i <<= 7; 5398: eshup8 (x); 5399: x[M] &= 0177; 5400: i |= x[M]; 5401: *y++ |= i; 5402: *y++ = x[M + 1]; 5403: *y++ = x[M + 2]; 5404: *y++ = x[M + 3]; 5405: } 1.1.1.2 root 5406: #endif /* DEC */ 5407: 5408: #ifdef IBM 1.1.1.3 root 5409: /* Convert IBM single/double precision to e type. */ 1.1.1.2 root 5410: 1.1.1.3 root 5411: static void 1.1.1.2 root 5412: ibmtoe (d, e, mode) 5413: unsigned EMUSHORT *d; 5414: unsigned EMUSHORT *e; 5415: enum machine_mode mode; 5416: { 5417: unsigned EMUSHORT y[NI]; 5418: register unsigned EMUSHORT r, *p; 5419: int rndsav; 5420: 5421: ecleaz (y); /* start with a zero */ 5422: p = y; /* point to our number */ 5423: r = *d; /* get IBM exponent word */ 5424: if (*d & (unsigned int) 0x8000) 5425: *p = 0xffff; /* fill in our sign */ 5426: ++p; /* bump pointer to our exponent word */ 5427: r &= 0x7f00; /* strip the sign bit */ 5428: r >>= 6; /* shift exponent word down 6 bits */ 5429: /* in fact shift by 8 right and 2 left */ 5430: r += EXONE - (0x41 << 2); /* subtract IBM exponent offset */ 5431: /* add our e type exponent offset */ 5432: *p++ = r; /* to form our exponent */ 5433: 5434: *p++ = *d++ & 0xff; /* now do the high order mantissa */ 5435: /* strip off the IBM exponent and sign bits */ 5436: if (mode != SFmode) /* there are only 2 words in SFmode */ 5437: { 5438: *p++ = *d++; /* fill in the rest of our mantissa */ 5439: *p++ = *d++; 5440: } 5441: *p = *d; 5442: 5443: if (y[M] == 0 && y[M+1] == 0 && y[M+2] == 0 && y[M+3] == 0) 5444: y[0] = y[E] = 0; 5445: else 5446: y[E] -= 5 + enormlz (y); /* now normalise the mantissa */ 5447: /* handle change in RADIX */ 5448: emovo (y, e); 5449: } 1.1 root 5450: 5451: 5452: 1.1.1.3 root 5453: /* Convert e type to IBM single/double precision. */ 1.1.1.2 root 5454: 1.1.1.3 root 5455: static void 1.1.1.2 root 5456: etoibm (x, d, mode) 5457: unsigned EMUSHORT *x, *d; 5458: enum machine_mode mode; 5459: { 5460: unsigned EMUSHORT xi[NI]; 5461: EMULONG exp; 5462: int rndsav; 5463: 5464: emovi (x, xi); 5465: exp = (EMULONG) xi[E] - (EXONE - (0x41 << 2)); /* adjust exponent for offsets */ 5466: /* round off to nearest or even */ 5467: rndsav = rndprc; 5468: rndprc = 56; 5469: emdnorm (xi, 0, 0, exp, 64); 5470: rndprc = rndsav; 5471: toibm (xi, d, mode); 5472: } 5473: 1.1.1.3 root 5474: static void 1.1.1.2 root 5475: toibm (x, y, mode) 5476: unsigned EMUSHORT *x, *y; 5477: enum machine_mode mode; 5478: { 5479: unsigned EMUSHORT i; 5480: unsigned EMUSHORT *p; 5481: int r; 5482: 5483: p = x; 5484: *y = 0; 5485: if (*p++) 5486: *y = 0x8000; 5487: i = *p++; 5488: if (i == 0) 5489: { 5490: *y++ = 0; 5491: *y++ = 0; 5492: if (mode != SFmode) 5493: { 5494: *y++ = 0; 5495: *y++ = 0; 5496: } 5497: return; 5498: } 5499: r = i & 0x3; 5500: i >>= 2; 5501: if (i > 0x7f) 5502: { 5503: *y++ |= 0x7fff; 5504: *y++ = 0xffff; 5505: if (mode != SFmode) 5506: { 5507: *y++ = 0xffff; 5508: *y++ = 0xffff; 5509: } 5510: #ifdef ERANGE 5511: errno = ERANGE; 5512: #endif 5513: return; 5514: } 5515: i &= 0x7f; 5516: *y |= (i << 8); 5517: eshift (x, r + 5); 5518: *y++ |= x[M]; 5519: *y++ = x[M + 1]; 5520: if (mode != SFmode) 5521: { 5522: *y++ = x[M + 2]; 5523: *y++ = x[M + 3]; 5524: } 5525: } 5526: #endif /* IBM */ 5527: 1.1 root 5528: /* Output a binary NaN bit pattern in the target machine's format. */ 5529: 5530: /* If special NaN bit patterns are required, define them in tm.h 5531: as arrays of unsigned 16-bit shorts. Otherwise, use the default 5532: patterns here. */ 5533: #ifdef TFMODE_NAN 5534: TFMODE_NAN; 5535: #else 1.1.1.4 ! root 5536: #ifdef IEEE ! 5537: unsigned EMUSHORT TFbignan[8] = 1.1 root 5538: {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; 1.1.1.4 ! root 5539: unsigned EMUSHORT TFlittlenan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff}; 1.1 root 5540: #endif 5541: #endif 5542: 5543: #ifdef XFMODE_NAN 5544: XFMODE_NAN; 5545: #else 1.1.1.4 ! root 5546: #ifdef IEEE ! 5547: unsigned EMUSHORT XFbignan[6] = ! 5548: {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; ! 5549: unsigned EMUSHORT XFlittlenan[6] = {0, 0, 0, 0xc000, 0xffff, 0}; 1.1 root 5550: #endif 5551: #endif 5552: 5553: #ifdef DFMODE_NAN 5554: DFMODE_NAN; 5555: #else 1.1.1.4 ! root 5556: #ifdef IEEE ! 5557: unsigned EMUSHORT DFbignan[4] = {0x7fff, 0xffff, 0xffff, 0xffff}; ! 5558: unsigned EMUSHORT DFlittlenan[4] = {0, 0, 0, 0xfff8}; 1.1 root 5559: #endif 5560: #endif 5561: 5562: #ifdef SFMODE_NAN 5563: SFMODE_NAN; 5564: #else 1.1.1.4 ! root 5565: #ifdef IEEE ! 5566: unsigned EMUSHORT SFbignan[2] = {0x7fff, 0xffff}; ! 5567: unsigned EMUSHORT SFlittlenan[2] = {0, 0xffc0}; 1.1 root 5568: #endif 5569: #endif 5570: 5571: 1.1.1.3 root 5572: static void 5573: make_nan (nan, sign, mode) 5574: unsigned EMUSHORT *nan; 5575: int sign; 5576: enum machine_mode mode; 1.1 root 5577: { 1.1.1.3 root 5578: int n; 1.1 root 5579: unsigned EMUSHORT *p; 5580: 5581: switch (mode) 5582: { 5583: /* Possibly the `reserved operand' patterns on a VAX can be 5584: used like NaN's, but probably not in the same way as IEEE. */ 1.1.1.2 root 5585: #if !defined(DEC) && !defined(IBM) 1.1 root 5586: case TFmode: 5587: n = 8; 1.1.1.4 ! root 5588: if (REAL_WORDS_BIG_ENDIAN) ! 5589: p = TFbignan; ! 5590: else ! 5591: p = TFlittlenan; 1.1 root 5592: break; 5593: case XFmode: 5594: n = 6; 1.1.1.4 ! root 5595: if (REAL_WORDS_BIG_ENDIAN) ! 5596: p = XFbignan; ! 5597: else ! 5598: p = XFlittlenan; 1.1 root 5599: break; 5600: case DFmode: 5601: n = 4; 1.1.1.4 ! root 5602: if (REAL_WORDS_BIG_ENDIAN) ! 5603: p = DFbignan; ! 5604: else ! 5605: p = DFlittlenan; 1.1 root 5606: break; 1.1.1.3 root 5607: case HFmode: 1.1 root 5608: case SFmode: 5609: n = 2; 1.1.1.4 ! root 5610: if (REAL_WORDS_BIG_ENDIAN) ! 5611: p = SFbignan; ! 5612: else ! 5613: p = SFlittlenan; 1.1 root 5614: break; 5615: #endif 5616: default: 5617: abort (); 5618: } 1.1.1.4 ! root 5619: if (REAL_WORDS_BIG_ENDIAN) ! 5620: *nan++ = (sign << 15) | *p++; 1.1.1.3 root 5621: while (--n != 0) 1.1 root 5622: *nan++ = *p++; 1.1.1.4 ! root 5623: if (! REAL_WORDS_BIG_ENDIAN) ! 5624: *nan = (sign << 15) | *p; 1.1 root 5625: } 5626: 5627: /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE. 5628: This is the inverse of the function `etarsingle' invoked by 5629: REAL_VALUE_TO_TARGET_SINGLE. */ 5630: 5631: REAL_VALUE_TYPE 5632: ereal_from_float (f) 1.1.1.3 root 5633: HOST_WIDE_INT f; 1.1 root 5634: { 5635: REAL_VALUE_TYPE r; 5636: unsigned EMUSHORT s[2]; 5637: unsigned EMUSHORT e[NE]; 5638: 5639: /* Convert 32 bit integer to array of 16 bit pieces in target machine order. 5640: This is the inverse operation to what the function `endian' does. */ 1.1.1.4 ! root 5641: if (REAL_WORDS_BIG_ENDIAN) ! 5642: { ! 5643: s[0] = (unsigned EMUSHORT) (f >> 16); ! 5644: s[1] = (unsigned EMUSHORT) f; ! 5645: } ! 5646: else ! 5647: { ! 5648: s[0] = (unsigned EMUSHORT) f; ! 5649: s[1] = (unsigned EMUSHORT) (f >> 16); ! 5650: } 1.1 root 5651: /* Convert and promote the target float to E-type. */ 5652: e24toe (s, e); 5653: /* Output E-type to REAL_VALUE_TYPE. */ 5654: PUT_REAL (e, &r); 5655: return r; 5656: } 5657: 1.1.1.2 root 5658: 1.1 root 5659: /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE. 5660: This is the inverse of the function `etardouble' invoked by 5661: REAL_VALUE_TO_TARGET_DOUBLE. 5662: 1.1.1.3 root 5663: The DFmode is stored as an array of HOST_WIDE_INT in the target's 5664: data format, with no holes in the bit packing. The first element 1.1 root 5665: of the input array holds the bits that would come first in the 5666: target computer's memory. */ 5667: 5668: REAL_VALUE_TYPE 5669: ereal_from_double (d) 1.1.1.3 root 5670: HOST_WIDE_INT d[]; 1.1 root 5671: { 5672: REAL_VALUE_TYPE r; 5673: unsigned EMUSHORT s[4]; 5674: unsigned EMUSHORT e[NE]; 5675: 1.1.1.3 root 5676: /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */ 1.1.1.4 ! root 5677: if (REAL_WORDS_BIG_ENDIAN) ! 5678: { ! 5679: s[0] = (unsigned EMUSHORT) (d[0] >> 16); ! 5680: s[1] = (unsigned EMUSHORT) d[0]; 1.1.1.3 root 5681: #if HOST_BITS_PER_WIDE_INT == 32 1.1.1.4 ! root 5682: s[2] = (unsigned EMUSHORT) (d[1] >> 16); ! 5683: s[3] = (unsigned EMUSHORT) d[1]; 1.1 root 5684: #else 1.1.1.4 ! root 5685: /* In this case the entire target double is contained in the ! 5686: first array element. The second element of the input is ! 5687: ignored. */ ! 5688: s[2] = (unsigned EMUSHORT) (d[0] >> 48); ! 5689: s[3] = (unsigned EMUSHORT) (d[0] >> 32); 1.1.1.3 root 5690: #endif 1.1.1.4 ! root 5691: } ! 5692: else ! 5693: { ! 5694: /* Target float words are little-endian. */ ! 5695: s[0] = (unsigned EMUSHORT) d[0]; ! 5696: s[1] = (unsigned EMUSHORT) (d[0] >> 16); 1.1.1.3 root 5697: #if HOST_BITS_PER_WIDE_INT == 32 1.1.1.4 ! root 5698: s[2] = (unsigned EMUSHORT) d[1]; ! 5699: s[3] = (unsigned EMUSHORT) (d[1] >> 16); 1.1.1.3 root 5700: #else 1.1.1.4 ! root 5701: s[2] = (unsigned EMUSHORT) (d[0] >> 32); ! 5702: s[3] = (unsigned EMUSHORT) (d[0] >> 48); 1.1 root 5703: #endif 1.1.1.4 ! root 5704: } 1.1 root 5705: /* Convert target double to E-type. */ 5706: e53toe (s, e); 5707: /* Output E-type to REAL_VALUE_TYPE. */ 5708: PUT_REAL (e, &r); 5709: return r; 5710: } 1.1.1.2 root 5711: 5712: 5713: /* Convert target computer unsigned 64-bit integer to e-type. 5714: The endian-ness of DImode follows the convention for integers, 1.1.1.4 ! root 5715: so we use WORDS_BIG_ENDIAN here, not REAL_WORDS_BIG_ENDIAN. */ 1.1.1.2 root 5716: 1.1.1.3 root 5717: static void 1.1.1.2 root 5718: uditoe (di, e) 5719: unsigned EMUSHORT *di; /* Address of the 64-bit int. */ 5720: unsigned EMUSHORT *e; 5721: { 5722: unsigned EMUSHORT yi[NI]; 5723: int k; 5724: 5725: ecleaz (yi); 1.1.1.4 ! root 5726: if (WORDS_BIG_ENDIAN) ! 5727: { ! 5728: for (k = M; k < M + 4; k++) ! 5729: yi[k] = *di++; ! 5730: } ! 5731: else ! 5732: { ! 5733: for (k = M + 3; k >= M; k--) ! 5734: yi[k] = *di++; ! 5735: } 1.1.1.2 root 5736: yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */ 5737: if ((k = enormlz (yi)) > NBITS)/* normalize the significand */ 5738: ecleaz (yi); /* it was zero */ 5739: else 5740: yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */ 5741: emovo (yi, e); 5742: } 5743: 5744: /* Convert target computer signed 64-bit integer to e-type. */ 5745: 1.1.1.3 root 5746: static void 1.1.1.2 root 5747: ditoe (di, e) 5748: unsigned EMUSHORT *di; /* Address of the 64-bit int. */ 5749: unsigned EMUSHORT *e; 5750: { 5751: unsigned EMULONG acc; 5752: unsigned EMUSHORT yi[NI]; 5753: unsigned EMUSHORT carry; 5754: int k, sign; 5755: 5756: ecleaz (yi); 1.1.1.4 ! root 5757: if (WORDS_BIG_ENDIAN) ! 5758: { ! 5759: for (k = M; k < M + 4; k++) ! 5760: yi[k] = *di++; ! 5761: } ! 5762: else ! 5763: { ! 5764: for (k = M + 3; k >= M; k--) ! 5765: yi[k] = *di++; ! 5766: } 1.1.1.2 root 5767: /* Take absolute value */ 5768: sign = 0; 5769: if (yi[M] & 0x8000) 5770: { 5771: sign = 1; 5772: carry = 0; 5773: for (k = M + 3; k >= M; k--) 5774: { 5775: acc = (unsigned EMULONG) (~yi[k] & 0xffff) + carry; 5776: yi[k] = acc; 5777: carry = 0; 5778: if (acc & 0x10000) 5779: carry = 1; 5780: } 5781: } 5782: yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */ 5783: if ((k = enormlz (yi)) > NBITS)/* normalize the significand */ 5784: ecleaz (yi); /* it was zero */ 5785: else 5786: yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */ 5787: emovo (yi, e); 5788: if (sign) 5789: eneg (e); 5790: } 5791: 5792: 5793: /* Convert e-type to unsigned 64-bit int. */ 5794: 1.1.1.3 root 5795: static void 1.1.1.2 root 5796: etoudi (x, i) 5797: unsigned EMUSHORT *x; 5798: unsigned EMUSHORT *i; 5799: { 5800: unsigned EMUSHORT xi[NI]; 5801: int j, k; 5802: 5803: emovi (x, xi); 5804: if (xi[0]) 5805: { 5806: xi[M] = 0; 5807: goto noshift; 5808: } 5809: k = (int) xi[E] - (EXONE - 1); 5810: if (k <= 0) 5811: { 5812: for (j = 0; j < 4; j++) 5813: *i++ = 0; 5814: return; 5815: } 5816: if (k > 64) 5817: { 5818: for (j = 0; j < 4; j++) 5819: *i++ = 0xffff; 5820: if (extra_warnings) 5821: warning ("overflow on truncation to integer"); 5822: return; 5823: } 5824: if (k > 16) 5825: { 5826: /* Shift more than 16 bits: first shift up k-16 mod 16, 5827: then shift up by 16's. */ 5828: j = k - ((k >> 4) << 4); 5829: if (j == 0) 5830: j = 16; 5831: eshift (xi, j); 1.1.1.4 ! root 5832: if (WORDS_BIG_ENDIAN) ! 5833: *i++ = xi[M]; ! 5834: else ! 5835: { ! 5836: i += 3; ! 5837: *i-- = xi[M]; ! 5838: } 1.1.1.2 root 5839: k -= j; 5840: do 5841: { 5842: eshup6 (xi); 1.1.1.4 ! root 5843: if (WORDS_BIG_ENDIAN) ! 5844: *i++ = xi[M]; ! 5845: else ! 5846: *i-- = xi[M]; 1.1.1.2 root 5847: } 5848: while ((k -= 16) > 0); 5849: } 5850: else 5851: { 5852: /* shift not more than 16 bits */ 5853: eshift (xi, k); 5854: 5855: noshift: 5856: 1.1.1.4 ! root 5857: if (WORDS_BIG_ENDIAN) ! 5858: { ! 5859: i += 3; ! 5860: *i-- = xi[M]; ! 5861: *i-- = 0; ! 5862: *i-- = 0; ! 5863: *i = 0; ! 5864: } ! 5865: else ! 5866: { ! 5867: *i++ = xi[M]; ! 5868: *i++ = 0; ! 5869: *i++ = 0; ! 5870: *i = 0; ! 5871: } 1.1.1.2 root 5872: } 5873: } 5874: 5875: 5876: /* Convert e-type to signed 64-bit int. */ 5877: 1.1.1.3 root 5878: static void 1.1.1.2 root 5879: etodi (x, i) 5880: unsigned EMUSHORT *x; 5881: unsigned EMUSHORT *i; 5882: { 5883: unsigned EMULONG acc; 5884: unsigned EMUSHORT xi[NI]; 5885: unsigned EMUSHORT carry; 5886: unsigned EMUSHORT *isave; 5887: int j, k; 5888: 5889: emovi (x, xi); 5890: k = (int) xi[E] - (EXONE - 1); 5891: if (k <= 0) 5892: { 5893: for (j = 0; j < 4; j++) 5894: *i++ = 0; 5895: return; 5896: } 5897: if (k > 64) 5898: { 5899: for (j = 0; j < 4; j++) 5900: *i++ = 0xffff; 5901: if (extra_warnings) 5902: warning ("overflow on truncation to integer"); 5903: return; 5904: } 5905: isave = i; 5906: if (k > 16) 5907: { 5908: /* Shift more than 16 bits: first shift up k-16 mod 16, 5909: then shift up by 16's. */ 5910: j = k - ((k >> 4) << 4); 5911: if (j == 0) 5912: j = 16; 5913: eshift (xi, j); 1.1.1.4 ! root 5914: if (WORDS_BIG_ENDIAN) ! 5915: *i++ = xi[M]; ! 5916: else ! 5917: { ! 5918: i += 3; ! 5919: *i-- = xi[M]; ! 5920: } 1.1.1.2 root 5921: k -= j; 5922: do 5923: { 5924: eshup6 (xi); 1.1.1.4 ! root 5925: if (WORDS_BIG_ENDIAN) ! 5926: *i++ = xi[M]; ! 5927: else ! 5928: *i-- = xi[M]; 1.1.1.2 root 5929: } 5930: while ((k -= 16) > 0); 5931: } 5932: else 5933: { 5934: /* shift not more than 16 bits */ 5935: eshift (xi, k); 5936: 1.1.1.4 ! root 5937: if (WORDS_BIG_ENDIAN) ! 5938: { ! 5939: i += 3; ! 5940: *i = xi[M]; ! 5941: *i-- = 0; ! 5942: *i-- = 0; ! 5943: *i = 0; ! 5944: } ! 5945: else ! 5946: { ! 5947: *i++ = xi[M]; ! 5948: *i++ = 0; ! 5949: *i++ = 0; ! 5950: *i = 0; ! 5951: } 1.1.1.2 root 5952: } 5953: /* Negate if negative */ 5954: if (xi[0]) 5955: { 5956: carry = 0; 1.1.1.4 ! root 5957: if (WORDS_BIG_ENDIAN) ! 5958: isave += 3; 1.1.1.2 root 5959: for (k = 0; k < 4; k++) 5960: { 5961: acc = (unsigned EMULONG) (~(*isave) & 0xffff) + carry; 1.1.1.4 ! root 5962: if (WORDS_BIG_ENDIAN) ! 5963: *isave-- = acc; ! 5964: else ! 5965: *isave++ = acc; 1.1.1.2 root 5966: carry = 0; 5967: if (acc & 0x10000) 5968: carry = 1; 5969: } 5970: } 5971: } 5972: 5973: 5974: /* Longhand square root routine. */ 5975: 5976: 5977: static int esqinited = 0; 5978: static unsigned short sqrndbit[NI]; 5979: 1.1.1.3 root 5980: static void 1.1.1.2 root 5981: esqrt (x, y) 5982: unsigned EMUSHORT *x, *y; 5983: { 5984: unsigned EMUSHORT temp[NI], num[NI], sq[NI], xx[NI]; 5985: EMULONG m, exp; 5986: int i, j, k, n, nlups; 5987: 5988: if (esqinited == 0) 5989: { 5990: ecleaz (sqrndbit); 5991: sqrndbit[NI - 2] = 1; 5992: esqinited = 1; 5993: } 5994: /* Check for arg <= 0 */ 5995: i = ecmp (x, ezero); 5996: if (i <= 0) 5997: { 1.1.1.3 root 5998: if (i == -1) 1.1.1.2 root 5999: { 1.1.1.3 root 6000: mtherr ("esqrt", DOMAIN); 6001: eclear (y); 1.1.1.2 root 6002: } 1.1.1.3 root 6003: else 6004: emov (x, y); 1.1.1.2 root 6005: return; 6006: } 6007: 6008: #ifdef INFINITY 6009: if (eisinf (x)) 6010: { 6011: eclear (y); 6012: einfin (y); 6013: return; 6014: } 6015: #endif 6016: /* Bring in the arg and renormalize if it is denormal. */ 6017: emovi (x, xx); 6018: m = (EMULONG) xx[1]; /* local long word exponent */ 6019: if (m == 0) 6020: m -= enormlz (xx); 6021: 6022: /* Divide exponent by 2 */ 6023: m -= 0x3ffe; 6024: exp = (unsigned short) ((m / 2) + 0x3ffe); 6025: 6026: /* Adjust if exponent odd */ 6027: if ((m & 1) != 0) 6028: { 6029: if (m > 0) 6030: exp += 1; 6031: eshdn1 (xx); 6032: } 6033: 6034: ecleaz (sq); 6035: ecleaz (num); 6036: n = 8; /* get 8 bits of result per inner loop */ 6037: nlups = rndprc; 6038: j = 0; 6039: 6040: while (nlups > 0) 6041: { 6042: /* bring in next word of arg */ 6043: if (j < NE) 6044: num[NI - 1] = xx[j + 3]; 6045: /* Do additional bit on last outer loop, for roundoff. */ 6046: if (nlups <= 8) 6047: n = nlups + 1; 6048: for (i = 0; i < n; i++) 6049: { 6050: /* Next 2 bits of arg */ 6051: eshup1 (num); 6052: eshup1 (num); 6053: /* Shift up answer */ 6054: eshup1 (sq); 6055: /* Make trial divisor */ 6056: for (k = 0; k < NI; k++) 6057: temp[k] = sq[k]; 6058: eshup1 (temp); 6059: eaddm (sqrndbit, temp); 6060: /* Subtract and insert answer bit if it goes in */ 6061: if (ecmpm (temp, num) <= 0) 6062: { 6063: esubm (temp, num); 6064: sq[NI - 2] |= 1; 6065: } 6066: } 6067: nlups -= n; 6068: j += 1; 6069: } 6070: 6071: /* Adjust for extra, roundoff loop done. */ 6072: exp += (NBITS - 1) - rndprc; 6073: 6074: /* Sticky bit = 1 if the remainder is nonzero. */ 6075: k = 0; 6076: for (i = 3; i < NI; i++) 6077: k |= (int) num[i]; 6078: 6079: /* Renormalize and round off. */ 6080: emdnorm (sq, k, 0, exp, 64); 6081: emovo (sq, y); 6082: } 1.1 root 6083: #endif /* EMU_NON_COMPILE not defined */ 1.1.1.3 root 6084: 6085: /* Return the binary precision of the significand for a given 6086: floating point mode. The mode can hold an integer value 6087: that many bits wide, without losing any bits. */ 6088: 6089: int 6090: significand_size (mode) 6091: enum machine_mode mode; 6092: { 6093: 6094: switch (mode) 6095: { 6096: case SFmode: 6097: return 24; 6098: 6099: case DFmode: 6100: #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT 6101: return 53; 6102: #else 6103: #if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT 6104: return 56; 6105: #else 6106: #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT 6107: return 56; 6108: #else 6109: abort (); 6110: #endif 6111: #endif 6112: #endif 6113: 6114: case XFmode: 6115: return 64; 6116: case TFmode: 6117: return 113; 6118: 6119: default: 6120: abort (); 6121: } 6122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.