home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / gcc-2.4.5 / real.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-13  |  94.1 KB  |  5,061 lines

  1. /* real.c - implementation of REAL_ARITHMETIC, REAL_VALUE_ATOF,
  2. and support for XFmode IEEE extended real floating point arithmetic.
  3. Contributed by Stephen L. Moshier (moshier@world.std.com).
  4.  
  5.    Copyright (C) 1993 Free Software Foundation, Inc.
  6.  
  7. This file is part of GNU CC.
  8.  
  9. GNU CC is free software; you can redistribute it and/or modify
  10. it under the terms of the GNU General Public License as published by
  11. the Free Software Foundation; either version 2, or (at your option)
  12. any later version.
  13.  
  14. GNU CC is distributed in the hope that it will be useful,
  15. but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. GNU General Public License for more details.
  18.  
  19. You should have received a copy of the GNU General Public License
  20. along with GNU CC; see the file COPYING.  If not, write to
  21. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  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.  
  35. To support cross compilation between IEEE and VAX floating
  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.  
  48. The first part of this file interfaces gcc to ieee.c, which is a
  49. floating point arithmetic suite that was not written with gcc in
  50. mind.  The interface is followed by ieee.c itself and related
  51. items. Avoid changing ieee.c unless you have suitable test
  52. programs available.  A special version of the PARANOIA floating
  53. point arithmetic tester, modified for this purpose, can be found
  54. on usc.edu : /pub/C-numanal/ieeetest.zoo.  Some tutorial
  55. information on ieee.c is given in my book: S. L. Moshier,
  56. _Methods and Programs for Mathematical Functions_, Prentice-Hall
  57. or Simon & Schuster Int'l, 1989.  A library of XFmode elementary
  58. transcendental functions can be obtained by ftp from
  59. research.att.com: netlib/cephes/ldouble.shar.Z  */
  60.  
  61. /* Type of computer arithmetic.
  62.  * Only one of DEC, MIEEE, IBMPC, or UNK should get defined.
  63.  */
  64.  
  65. /* `MIEEE' refers generically to big-endian IEEE floating-point data
  66.    structure.  This definition should work in SFmode `float' type and
  67.    DFmode `double' type on virtually all big-endian IEEE machines.
  68.    If LONG_DOUBLE_TYPE_SIZE has been defined to be 96, then MIEEE
  69.    also invokes the particular XFmode (`long double' type) data
  70.    structure used by the Motorola 680x0 series processors.
  71.  
  72.    `IBMPC' refers generally to little-endian IEEE machines. In this
  73.    case, if LONG_DOUBLE_TYPE_SIZE has been defined to be 96, then
  74.    IBMPC also invokes the particular XFmode `long double' data
  75.    structure used by the Intel 80x86 series processors.
  76.  
  77.    `DEC' refers specifically to the Digital Equipment Corp PDP-11
  78.    and VAX floating point data structure.  This model currently
  79.    supports no type wider than DFmode.
  80.  
  81.    If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
  82.    then `long double' and `double' are both implemented, but they
  83.    both mean DFmode.  In this case, the software floating-point
  84.    support available here is activated by writing
  85.       #define REAL_ARITHMETIC
  86.    in tm.h. 
  87.  
  88.    The case LONG_DOUBLE_TYPE_SIZE = 128 activates TFmode support
  89.    (Not Yet Implemented) and may deactivate XFmode since
  90.    `long double' is used to refer to both modes.    */
  91.  
  92. /* The following converts gcc macros into the ones used by this file.  */
  93.  
  94. /* REAL_ARITHMETIC defined means that macros in real.h are
  95.    defined to call emulator functions.  */
  96. #ifdef REAL_ARITHMETIC
  97.  
  98. #if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT
  99. /* PDP-11, Pro350, VAX: */
  100. #define DEC 1
  101. #else /* it's not VAX */
  102. #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
  103. #if WORDS_BIG_ENDIAN
  104. /* Motorola IEEE, high order words come first (Sun workstation): */
  105. #define MIEEE 1
  106. #else /* not big-endian */
  107. /* Intel IEEE, low order words come first:
  108.  */
  109. #define IBMPC 1
  110. #endif /*  big-endian */
  111. #else /* it's not IEEE either */
  112. /* UNKnown arithmetic.  We don't support this and can't go on. */
  113. unknown arithmetic type
  114. #define UNK 1
  115. #endif /* not IEEE */
  116. #endif /* not VAX */
  117.  
  118. #else
  119. /* REAL_ARITHMETIC not defined means that the *host's* data
  120.    structure will be used.  It may differ by endian-ness from the
  121.    target machine's structure and will get its ends swapped
  122.    accordingly (but not here).  Probably only the decimal <-> binary
  123.    functions in this file will actually be used in this case.  */
  124. #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
  125. #define DEC 1
  126. #else /* it's not VAX */
  127. #if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
  128. #ifdef HOST_WORDS_BIG_ENDIAN
  129. #define MIEEE 1
  130. #else /* not big-endian */
  131. #define IBMPC 1
  132. #endif /*  big-endian */
  133. #else /* it's not IEEE either */
  134. unknown arithmetic type
  135. #define UNK 1
  136. #endif /* not IEEE */
  137. #endif /* not VAX */
  138.  
  139. #endif /* REAL_ARITHMETIC not defined */
  140.  
  141. /* Define INFINITY for support of infinity.
  142.    Define NANS for support of Not-a-Number's (NaN's).  */
  143. #ifndef DEC
  144. #define INFINITY
  145. #define NANS
  146. #endif
  147.  
  148. /* Support of NaNs requires support of infinity. */
  149. #ifdef NANS
  150. #ifndef INFINITY
  151. #define INFINITY
  152. #endif
  153. #endif
  154.  
  155. /* ehead.h
  156.  *
  157.  * Include file for extended precision arithmetic programs.
  158.  */
  159.  
  160. /* Number of 16 bit words in external e type format */
  161. #define NE 6
  162.  
  163. /* Number of 16 bit words in internal format */
  164. #define NI (NE+3)
  165.  
  166. /* Array offset to exponent */
  167. #define E 1
  168.  
  169. /* Array offset to high guard word */
  170. #define M 2
  171.  
  172. /* Number of bits of precision */
  173. #define NBITS ((NI-4)*16)
  174.  
  175. /* Maximum number of decimal digits in ASCII conversion
  176.  * = NBITS*log10(2)
  177.  */
  178. #define NDEC (NBITS*8/27)
  179.  
  180. /* The exponent of 1.0 */
  181. #define EXONE (0x3fff)
  182.  
  183. /* Find a host integer type that is at least 16 bits wide,
  184.    and another type at least twice whatever that size is. */
  185.  
  186. #if HOST_BITS_PER_CHAR >= 16
  187. #define EMUSHORT char
  188. #define EMUSHORT_SIZE HOST_BITS_PER_CHAR
  189. #define EMULONG_SIZE (2 * HOST_BITS_PER_CHAR)
  190. #else
  191. #if HOST_BITS_PER_SHORT >= 16
  192. #define EMUSHORT short
  193. #define EMUSHORT_SIZE HOST_BITS_PER_SHORT
  194. #define EMULONG_SIZE (2 * HOST_BITS_PER_SHORT)
  195. #else
  196. #if HOST_BITS_PER_INT >= 16
  197. #define EMUSHORT int
  198. #define EMUSHORT_SIZE HOST_BITS_PER_INT
  199. #define EMULONG_SIZE (2 * HOST_BITS_PER_INT)
  200. #else
  201. #if HOST_BITS_PER_LONG >= 16
  202. #define EMUSHORT long
  203. #define EMUSHORT_SIZE HOST_BITS_PER_LONG
  204. #define EMULONG_SIZE (2 * HOST_BITS_PER_LONG)
  205. #else
  206. /*  You will have to modify this program to have a smaller unit size. */
  207. #define EMU_NON_COMPILE
  208. #endif
  209. #endif
  210. #endif
  211. #endif
  212.  
  213. #if HOST_BITS_PER_SHORT >= EMULONG_SIZE
  214. #define EMULONG short
  215. #else
  216. #if HOST_BITS_PER_INT >= EMULONG_SIZE
  217. #define EMULONG int
  218. #else
  219. #if HOST_BITS_PER_LONG >= EMULONG_SIZE
  220. #define EMULONG long
  221. #else
  222. #if HOST_BITS_PER_LONG_LONG >= EMULONG_SIZE
  223. #define EMULONG long long int
  224. #else
  225. /*  You will have to modify this program to have a smaller unit size. */
  226. #define EMU_NON_COMPILE
  227. #endif
  228. #endif
  229. #endif
  230. #endif
  231.  
  232.  
  233. /* The host interface doesn't work if no 16-bit size exists. */
  234. #if EMUSHORT_SIZE != 16
  235. #define EMU_NON_COMPILE
  236. #endif
  237.  
  238. /* OK to continue compilation. */
  239. #ifndef EMU_NON_COMPILE
  240.  
  241. /* Construct macros to translate between REAL_VALUE_TYPE and e type.
  242.    In GET_REAL and PUT_REAL, r and e are pointers.
  243.    A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations
  244.    in memory, with no holes.  */
  245.  
  246. #if LONG_DOUBLE_TYPE_SIZE == 96
  247. #define GET_REAL(r,e) bcopy (r, e, 2*NE)
  248. #define PUT_REAL(e,r) bcopy (e, r, 2*NE)
  249. #else /* no XFmode */
  250.  
  251. #ifdef REAL_ARITHMETIC
  252. /* Emulator uses target format internally
  253.    but host stores it in host endian-ness. */
  254.  
  255. #if defined (HOST_WORDS_BIG_ENDIAN) == WORDS_BIG_ENDIAN
  256. #define GET_REAL(r,e) e53toe ((r), (e))
  257. #define PUT_REAL(e,r) etoe53 ((e), (r))
  258.  
  259. #else /* endian-ness differs */
  260. /* emulator uses target endian-ness internally */
  261. #define GET_REAL(r,e)        \
  262. do { EMUSHORT w[4];        \
  263.  w[3] = ((EMUSHORT *) r)[0];    \
  264.  w[2] = ((EMUSHORT *) r)[1];    \
  265.  w[1] = ((EMUSHORT *) r)[2];    \
  266.  w[0] = ((EMUSHORT *) r)[3];    \
  267.  e53toe (w, (e)); } while (0)
  268.  
  269. #define PUT_REAL(e,r)        \
  270. do { EMUSHORT w[4];        \
  271.  etoe53 ((e), w);        \
  272.  *((EMUSHORT *) r) = w[3];    \
  273.  *((EMUSHORT *) r + 1) = w[2];    \
  274.  *((EMUSHORT *) r + 2) = w[1];    \
  275.  *((EMUSHORT *) r + 3) = w[0]; } while (0)
  276.  
  277. #endif /* endian-ness differs */
  278.  
  279. #else /* not REAL_ARITHMETIC */
  280.  
  281. /* emulator uses host format */
  282. #define GET_REAL(r,e) e53toe ((r), (e))
  283. #define PUT_REAL(e,r) etoe53 ((e), (r))
  284.  
  285. #endif /* not REAL_ARITHMETIC */
  286. #endif /* no XFmode */
  287.  
  288. void warning ();
  289. extern int extra_warnings;
  290. int ecmp (), enormlz (), eshift ();
  291. int eisneg (), eisinf (), eisnan (), eiisinf (), eiisnan ();
  292. void eadd (), esub (), emul (), ediv ();
  293. void eshup1 (), eshup8 (), eshup6 (), eshdn1 (), eshdn8 (), eshdn6 ();
  294. void eabs (), eneg (), emov (), eclear (), einfin (), efloor ();
  295. void eldexp (), efrexp (), eifrac (), euifrac (), ltoe (), ultoe ();
  296. void eround (), ereal_to_decimal (), eiinfin (), einan ();
  297. void esqrt (), elog (), eexp (), etanh (), epow ();
  298. void asctoe (), asctoe24 (), asctoe53 (), asctoe64 ();
  299. void etoasc (), e24toasc (), e53toasc (), e64toasc ();
  300. void etoe64 (), etoe53 (), etoe24 (), e64toe (), e53toe (), e24toe ();
  301. void mtherr (), make_nan ();
  302. void enan ();
  303. extern unsigned EMUSHORT ezero[], ehalf[], eone[], etwo[];
  304. extern unsigned EMUSHORT elog2[], esqrt2[];
  305.  
  306. /* Pack output array with 32-bit numbers obtained from
  307.    array containing 16-bit numbers, swapping ends if required. */
  308. void 
  309. endian (e, x, mode)
  310.      unsigned EMUSHORT e[];
  311.      long x[];
  312.      enum machine_mode mode;
  313. {
  314.   unsigned long th, t;
  315.  
  316. #if WORDS_BIG_ENDIAN
  317.   switch (mode)
  318.     {
  319.  
  320.     case XFmode:
  321.  
  322.       /* Swap halfwords in the third long. */
  323.       th = (unsigned long) e[4] & 0xffff;
  324.       t = (unsigned long) e[5] & 0xffff;
  325.       t |= th << 16;
  326.       x[2] = (long) t;
  327.       /* fall into the double case */
  328.  
  329.     case DFmode:
  330.  
  331.       /* swap halfwords in the second word */
  332.       th = (unsigned long) e[2] & 0xffff;
  333.       t = (unsigned long) e[3] & 0xffff;
  334.       t |= th << 16;
  335.       x[1] = (long) t;
  336.       /* fall into the float case */
  337.  
  338.     case SFmode:
  339.  
  340.       /* swap halfwords in the first word */
  341.       th = (unsigned long) e[0] & 0xffff;
  342.       t = (unsigned long) e[1] & 0xffff;
  343.       t |= th << 16;
  344.       x[0] = t;
  345.       break;
  346.  
  347.     default:
  348.       abort ();
  349.     }
  350.  
  351. #else
  352.  
  353.   /* Pack the output array without swapping. */
  354.  
  355.   switch (mode)
  356.     {
  357.  
  358.     case XFmode:
  359.  
  360.       /* Pack the third long.
  361.      Each element of the input REAL_VALUE_TYPE array has 16 bit useful bits
  362.      in it.  */
  363.       th = (unsigned long) e[5] & 0xffff;
  364.       t = (unsigned long) e[4] & 0xffff;
  365.       t |= th << 16;
  366.       x[2] = (long) t;
  367.       /* fall into the double case */
  368.  
  369.     case DFmode:
  370.  
  371.       /* pack the second long */
  372.       th = (unsigned long) e[3] & 0xffff;
  373.       t = (unsigned long) e[2] & 0xffff;
  374.       t |= th << 16;
  375.       x[1] = (long) t;
  376.       /* fall into the float case */
  377.  
  378.     case SFmode:
  379.  
  380.       /* pack the first long */
  381.       th = (unsigned long) e[1] & 0xffff;
  382.       t = (unsigned long) e[0] & 0xffff;
  383.       t |= th << 16;
  384.       x[0] = t;
  385.       break;
  386.  
  387.     default:
  388.       abort ();
  389.     }
  390.  
  391. #endif
  392. }
  393.  
  394.  
  395. /* This is the implementation of the REAL_ARITHMETIC macro.
  396.  */
  397. void 
  398. earith (value, icode, r1, r2)
  399.      REAL_VALUE_TYPE *value;
  400.      int icode;
  401.      REAL_VALUE_TYPE *r1;
  402.      REAL_VALUE_TYPE *r2;
  403. {
  404.   unsigned EMUSHORT d1[NE], d2[NE], v[NE];
  405.   enum tree_code code;
  406.  
  407.   GET_REAL (r1, d1);
  408.   GET_REAL (r2, d2);
  409. #ifdef NANS
  410. /*  Return NaN input back to the caller. */
  411.   if (eisnan (d1))
  412.     {
  413.       PUT_REAL (d1, value);
  414.       return;
  415.     }
  416.   if (eisnan (d2))
  417.     {
  418.       PUT_REAL (d2, value);
  419.       return;
  420.     }
  421. #endif
  422.   code = (enum tree_code) icode;
  423.   switch (code)
  424.     {
  425.     case PLUS_EXPR:
  426.       eadd (d2, d1, v);
  427.       break;
  428.  
  429.     case MINUS_EXPR:
  430.       esub (d2, d1, v);        /* d1 - d2 */
  431.       break;
  432.  
  433.     case MULT_EXPR:
  434.       emul (d2, d1, v);
  435.       break;
  436.  
  437.     case RDIV_EXPR:
  438. #ifndef REAL_INFINITY
  439.       if (ecmp (d2, ezero) == 0)
  440.     {
  441. #ifdef NANS
  442.     enan (v);
  443.     break;
  444. #else
  445.     abort ();
  446. #endif
  447.     }
  448. #endif
  449.       ediv (d2, d1, v);    /* d1/d2 */
  450.       break;
  451.  
  452.     case MIN_EXPR:        /* min (d1,d2) */
  453.       if (ecmp (d1, d2) < 0)
  454.     emov (d1, v);
  455.       else
  456.     emov (d2, v);
  457.       break;
  458.  
  459.     case MAX_EXPR:        /* max (d1,d2) */
  460.       if (ecmp (d1, d2) > 0)
  461.     emov (d1, v);
  462.       else
  463.     emov (d2, v);
  464.       break;
  465.     default:
  466.       emov (ezero, v);
  467.       break;
  468.     }
  469. PUT_REAL (v, value);
  470. }
  471.  
  472.  
  473. /* Truncate REAL_VALUE_TYPE toward zero to signed HOST_WIDE_INT
  474.  * implements REAL_VALUE_RNDZINT (x) (etrunci (x))
  475.  */
  476. REAL_VALUE_TYPE 
  477. etrunci (x)
  478.      REAL_VALUE_TYPE x;
  479. {
  480.   unsigned EMUSHORT f[NE], g[NE];
  481.   REAL_VALUE_TYPE r;
  482.   long l;
  483.  
  484.   GET_REAL (&x, g);
  485. #ifdef NANS
  486.   if (eisnan (g))
  487.     return (x);
  488. #endif
  489.   eifrac (g, &l, f);
  490.   ltoe (&l, g);
  491.   PUT_REAL (g, &r);
  492.   return (r);
  493. }
  494.  
  495.  
  496. /* Truncate REAL_VALUE_TYPE toward zero to unsigned HOST_WIDE_INT
  497.  * implements REAL_VALUE_UNSIGNED_RNDZINT (x) (etruncui (x))
  498.  */
  499. REAL_VALUE_TYPE 
  500. etruncui (x)
  501.      REAL_VALUE_TYPE x;
  502. {
  503.   unsigned EMUSHORT f[NE], g[NE];
  504.   REAL_VALUE_TYPE r;
  505.   unsigned long l;
  506.  
  507.   GET_REAL (&x, g);
  508. #ifdef NANS
  509.   if (eisnan (g))
  510.     return (x);
  511. #endif
  512.   euifrac (g, &l, f);
  513.   ultoe (&l, g);
  514.   PUT_REAL (g, &r);
  515.   return (r);
  516. }
  517.  
  518.  
  519. /* This is the REAL_VALUE_ATOF function.
  520.  * It converts a decimal string to binary, rounding off
  521.  * as indicated by the machine_mode argument.  Then it
  522.  * promotes the rounded value to REAL_VALUE_TYPE.
  523.  */
  524. REAL_VALUE_TYPE 
  525. ereal_atof (s, t)
  526.      char *s;
  527.      enum machine_mode t;
  528. {
  529.   unsigned EMUSHORT tem[NE], e[NE];
  530.   REAL_VALUE_TYPE r;
  531.  
  532.   switch (t)
  533.     {
  534.     case SFmode:
  535.       asctoe24 (s, tem);
  536.       e24toe (tem, e);
  537.       break;
  538.     case DFmode:
  539.       asctoe53 (s, tem);
  540.       e53toe (tem, e);
  541.       break;
  542.     case XFmode:
  543.       asctoe64 (s, tem);
  544.       e64toe (tem, e);
  545.       break;
  546.     default:
  547.       asctoe (s, e);
  548.     }
  549.   PUT_REAL (e, &r);
  550.   return (r);
  551. }
  552.  
  553.  
  554. /* Expansion of REAL_NEGATE.
  555.  */
  556. REAL_VALUE_TYPE 
  557. ereal_negate (x)
  558.      REAL_VALUE_TYPE x;
  559. {
  560.   unsigned EMUSHORT e[NE];
  561.   REAL_VALUE_TYPE r;
  562.  
  563.   GET_REAL (&x, e);
  564. #ifdef NANS
  565.   if (eisnan (e))
  566.     return (x);
  567. #endif
  568.   eneg (e);
  569.   PUT_REAL (e, &r);
  570.   return (r);
  571. }
  572.  
  573.  
  574. /* Round real to int
  575.  * implements REAL_VALUE_FIX (x) (eroundi (x))
  576.  * The type of rounding is left unspecified by real.h.
  577.  * It is implemented here as round to nearest (add .5 and chop).
  578.  */
  579. int 
  580. eroundi (x)
  581.      REAL_VALUE_TYPE x;
  582. {
  583.   unsigned EMUSHORT f[NE], g[NE];
  584.   EMULONG l;
  585.  
  586.   GET_REAL (&x, f);
  587. #ifdef NANS
  588.   if (eisnan (f))
  589.     {
  590.       warning ("conversion from NaN to int");
  591.       return (-1);
  592.     }
  593. #endif
  594.   eround (f, g);
  595.   eifrac (g, &l, f);
  596.   return ((int) l);
  597. }
  598.  
  599. /* Round real to nearest unsigned int
  600.  * implements  REAL_VALUE_UNSIGNED_FIX (x) ((unsigned int) eroundi (x))
  601.  * Negative input returns zero.
  602.  * The type of rounding is left unspecified by real.h.
  603.  * It is implemented here as round to nearest (add .5 and chop).
  604.  */
  605. unsigned int 
  606. eroundui (x)
  607.      REAL_VALUE_TYPE x;
  608. {
  609.   unsigned EMUSHORT f[NE], g[NE];
  610.   unsigned EMULONG l;
  611.  
  612.   GET_REAL (&x, f);
  613. #ifdef NANS
  614.   if (eisnan (f))
  615.     {
  616.       warning ("conversion from NaN to unsigned int");
  617.       return (-1);
  618.     }
  619. #endif
  620.   eround (f, g);
  621.   euifrac (g, &l, f);
  622.   return ((unsigned int)l);
  623. }
  624.  
  625.  
  626. /* REAL_VALUE_FROM_INT macro.
  627.  */
  628. void 
  629. ereal_from_int (d, i, j)
  630.      REAL_VALUE_TYPE *d;
  631.      long i, j;
  632. {
  633.   unsigned EMUSHORT df[NE], dg[NE];
  634.   long low, high;
  635.   int sign;
  636.  
  637.   sign = 0;
  638.   low = i;
  639.   if ((high = j) < 0)
  640.     {
  641.       sign = 1;
  642.       /* complement and add 1 */
  643.       high = ~high;
  644.       if (low)
  645.     low = -low;
  646.       else
  647.     high += 1;
  648.     }
  649.   eldexp (eone, HOST_BITS_PER_LONG, df);
  650.   ultoe (&high, dg);
  651.   emul (dg, df, dg);
  652.   ultoe (&low, df);
  653.   eadd (df, dg, dg);
  654.   if (sign)
  655.     eneg (dg);
  656.   PUT_REAL (dg, d);
  657. }
  658.  
  659.  
  660. /* REAL_VALUE_FROM_UNSIGNED_INT macro.
  661.  */
  662. void 
  663. ereal_from_uint (d, i, j)
  664.      REAL_VALUE_TYPE *d;
  665.      unsigned long i, j;
  666. {
  667.   unsigned EMUSHORT df[NE], dg[NE];
  668.   unsigned long low, high;
  669.  
  670.   low = i;
  671.   high = j;
  672.   eldexp (eone, HOST_BITS_PER_LONG, df);
  673.   ultoe (&high, dg);
  674.   emul (dg, df, dg);
  675.   ultoe (&low, df);
  676.   eadd (df, dg, dg);
  677.   PUT_REAL (dg, d);
  678. }
  679.  
  680.  
  681. /* REAL_VALUE_TO_INT macro
  682.  */
  683. void 
  684. ereal_to_int (low, high, rr)
  685.      long *low, *high;
  686.      REAL_VALUE_TYPE rr;
  687. {
  688.   unsigned EMUSHORT d[NE], df[NE], dg[NE], dh[NE];
  689.   int s;
  690.  
  691.   GET_REAL (&rr, d);
  692. #ifdef NANS
  693.   if (eisnan (d))
  694.     {
  695.       warning ("conversion from NaN to int");
  696.       *low = -1;
  697.       *high = -1;
  698.       return;
  699.     }
  700. #endif
  701.   /* convert positive value */
  702.   s = 0;
  703.   if (eisneg (d))
  704.     {
  705.       eneg (d);
  706.       s = 1;
  707.     }
  708.   eldexp (eone, HOST_BITS_PER_LONG, df);
  709.   ediv (df, d, dg);        /* dg = d / 2^32 is the high word */
  710.   euifrac (dg, high, dh);
  711.   emul (df, dh, dg);        /* fractional part is the low word */
  712.   euifrac (dg, low, dh);
  713.   if (s)
  714.     {
  715.       /* complement and add 1 */
  716.       *high = ~(*high);
  717.       if (*low)
  718.     *low = -(*low);
  719.       else
  720.     *high += 1;
  721.     }
  722. }
  723.  
  724.  
  725. /* REAL_VALUE_LDEXP macro.
  726.  */
  727. REAL_VALUE_TYPE
  728. ereal_ldexp (x, n)
  729.      REAL_VALUE_TYPE x;
  730.      int n;
  731. {
  732.   unsigned EMUSHORT e[NE], y[NE];
  733.   REAL_VALUE_TYPE r;
  734.  
  735.   GET_REAL (&x, e);
  736. #ifdef NANS
  737.   if (eisnan (e))
  738.     return (x);
  739. #endif
  740.   eldexp (e, n, y);
  741.   PUT_REAL (y, &r);
  742.   return (r);
  743. }
  744.  
  745. /* These routines are conditionally compiled because functions
  746.  * of the same names may be defined in fold-const.c.  */
  747. #ifdef REAL_ARITHMETIC
  748.  
  749. /* Check for infinity in a REAL_VALUE_TYPE. */
  750. int
  751. target_isinf (x)
  752.      REAL_VALUE_TYPE x;
  753. {
  754.   unsigned EMUSHORT e[NE];
  755.  
  756. #ifdef INFINITY
  757.   GET_REAL (&x, e);
  758.   return (eisinf (e));
  759. #else
  760.   return 0;
  761. #endif
  762. }
  763.  
  764.  
  765. /* Check whether a REAL_VALUE_TYPE item is a NaN. */
  766.  
  767. int
  768. target_isnan (x)
  769.      REAL_VALUE_TYPE x;
  770. {
  771.   unsigned EMUSHORT e[NE];
  772.  
  773. #ifdef NANS
  774.   GET_REAL (&x, e);
  775.   return (eisnan (e));
  776. #else
  777.   return (0);
  778. #endif
  779. }
  780.  
  781.  
  782. /* Check for a negative REAL_VALUE_TYPE number.
  783.  * this means strictly less than zero, not -0.
  784.  */
  785.  
  786. int
  787. target_negative (x)
  788.      REAL_VALUE_TYPE x;
  789. {
  790.   unsigned EMUSHORT e[NE];
  791.  
  792.   GET_REAL (&x, e);
  793.   if (ecmp (e, ezero) == -1)
  794.     return (1);
  795.   return (0);
  796. }
  797.  
  798. /* Expansion of REAL_VALUE_TRUNCATE.
  799.  * The result is in floating point, rounded to nearest or even.
  800.  */
  801. REAL_VALUE_TYPE
  802. real_value_truncate (mode, arg)
  803.      enum machine_mode mode;
  804.      REAL_VALUE_TYPE arg;
  805. {
  806.   unsigned EMUSHORT e[NE], t[NE];
  807.   REAL_VALUE_TYPE r;
  808.  
  809.   GET_REAL (&arg, e);
  810. #ifdef NANS
  811.   if (eisnan (e))
  812.     return (arg);
  813. #endif
  814.   eclear (t);
  815.   switch (mode)
  816.     {
  817.     case XFmode:
  818.       etoe64 (e, t);
  819.       e64toe (t, t);
  820.       break;
  821.  
  822.     case DFmode:
  823.       etoe53 (e, t);
  824.       e53toe (t, t);
  825.       break;
  826.  
  827.     case SFmode:
  828.       etoe24 (e, t);
  829.       e24toe (t, t);
  830.       break;
  831.  
  832.     case SImode:
  833.       r = etrunci (e);
  834.       return (r);
  835.  
  836.     default:
  837.       abort ();
  838.     }
  839.   PUT_REAL (t, &r);
  840.   return (r);
  841. }
  842.  
  843. #endif /* REAL_ARITHMETIC defined */
  844.  
  845. /* Target values are arrays of host longs. A long is guaranteed
  846.    to be at least 32 bits wide. */
  847. void 
  848. etarldouble (r, l)
  849.      REAL_VALUE_TYPE r;
  850.      long l[];
  851. {
  852.   unsigned EMUSHORT e[NE];
  853.  
  854.   GET_REAL (&r, e);
  855.   etoe64 (e, e);
  856.   endian (e, l, XFmode);
  857. }
  858.  
  859. void 
  860. etardouble (r, l)
  861.      REAL_VALUE_TYPE r;
  862.      long l[];
  863. {
  864.   unsigned EMUSHORT e[NE];
  865.  
  866.   GET_REAL (&r, e);
  867.   etoe53 (e, e);
  868.   endian (e, l, DFmode);
  869. }
  870.  
  871. long
  872. etarsingle (r)
  873.      REAL_VALUE_TYPE r;
  874. {
  875.   unsigned EMUSHORT e[NE];
  876.   unsigned long l;
  877.  
  878.   GET_REAL (&r, e);
  879.   etoe24 (e, e);
  880.   endian (e, &l, SFmode);
  881.   return ((long) l);
  882. }
  883.  
  884. void
  885. ereal_to_decimal (x, s)
  886.      REAL_VALUE_TYPE x;
  887.      char *s;
  888. {
  889.   unsigned EMUSHORT e[NE];
  890.  
  891.   GET_REAL (&x, e);
  892.   etoasc (e, s, 20);
  893. }
  894.  
  895. int
  896. ereal_cmp (x, y)
  897.      REAL_VALUE_TYPE x, y;
  898. {
  899.   unsigned EMUSHORT ex[NE], ey[NE];
  900.  
  901.   GET_REAL (&x, ex);
  902.   GET_REAL (&y, ey);
  903.   return (ecmp (ex, ey));
  904. }
  905.  
  906. int
  907. ereal_isneg (x)
  908.      REAL_VALUE_TYPE x;
  909. {
  910.   unsigned EMUSHORT ex[NE];
  911.  
  912.   GET_REAL (&x, ex);
  913.   return (eisneg (ex));
  914. }
  915.  
  916. /* End of REAL_ARITHMETIC interface */
  917.  
  918. /*                            ieee.c
  919.  *
  920.  *    Extended precision IEEE binary floating point arithmetic routines
  921.  *
  922.  * Numbers are stored in C language as arrays of 16-bit unsigned
  923.  * short integers.  The arguments of the routines are pointers to
  924.  * the arrays.
  925.  *
  926.  *
  927.  * External e type data structure, simulates Intel 8087 chip
  928.  * temporary real format but possibly with a larger significand:
  929.  *
  930.  *    NE-1 significand words    (least significant word first,
  931.  *                 most significant bit is normally set)
  932.  *    exponent        (value = EXONE for 1.0,
  933.  *                top bit is the sign)
  934.  *
  935.  *
  936.  * Internal data structure of a number (a "word" is 16 bits):
  937.  *
  938.  * ei[0]    sign word    (0 for positive, 0xffff for negative)
  939.  * ei[1]    biased exponent    (value = EXONE for the number 1.0)
  940.  * ei[2]    high guard word    (always zero after normalization)
  941.  * ei[3]
  942.  * to ei[NI-2]    significand    (NI-4 significand words,
  943.  *                 most significant word first,
  944.  *                 most significant bit is set)
  945.  * ei[NI-1]    low guard word    (0x8000 bit is rounding place)
  946.  *
  947.  *
  948.  *
  949.  *        Routines for external format numbers
  950.  *
  951.  *    asctoe (string, e)    ASCII string to extended double e type
  952.  *    asctoe64 (string, &d)    ASCII string to long double
  953.  *    asctoe53 (string, &d)    ASCII string to double
  954.  *    asctoe24 (string, &f)    ASCII string to single
  955.  *    asctoeg (string, e, prec) ASCII string to specified precision
  956.  *    e24toe (&f, e)        IEEE single precision to e type
  957.  *    e53toe (&d, e)        IEEE double precision to e type
  958.  *    e64toe (&d, e)        IEEE long double precision to e type
  959.  *    eabs (e)            absolute value
  960.  *    eadd (a, b, c)        c = b + a
  961.  *    eclear (e)        e = 0
  962.  *    ecmp (a, b)        Returns 1 if a > b, 0 if a == b,
  963.  *                -1 if a < b, -2 if either a or b is a NaN.
  964.  *    ediv (a, b, c)        c = b / a
  965.  *    efloor (a, b)        truncate to integer, toward -infinity
  966.  *    efrexp (a, exp, s)    extract exponent and significand
  967.  *    eifrac (e, &l, frac)    e to long integer and e type fraction
  968.  *    euifrac (e, &l, frac)   e to unsigned long integer and e type fraction
  969.  *    einfin (e)        set e to infinity, leaving its sign alone
  970.  *    eldexp (a, n, b)    multiply by 2**n
  971.  *    emov (a, b)        b = a
  972.  *    emul (a, b, c)        c = b * a
  973.  *    eneg (e)            e = -e
  974.  *    eround (a, b)        b = nearest integer value to a
  975.  *    esub (a, b, c)        c = b - a
  976.  *    e24toasc (&f, str, n)    single to ASCII string, n digits after decimal
  977.  *    e53toasc (&d, str, n)    double to ASCII string, n digits after decimal
  978.  *    e64toasc (&d, str, n)    long double to ASCII string
  979.  *    etoasc (e, str, n)    e to ASCII string, n digits after decimal
  980.  *    etoe24 (e, &f)        convert e type to IEEE single precision
  981.  *    etoe53 (e, &d)        convert e type to IEEE double precision
  982.  *    etoe64 (e, &d)        convert e type to IEEE long double precision
  983.  *    ltoe (&l, e)        long (32 bit) integer to e type
  984.  *    ultoe (&l, e)        unsigned long (32 bit) integer to e type
  985.  *      eisneg (e)              1 if sign bit of e != 0, else 0
  986.  *      eisinf (e)              1 if e has maximum exponent (non-IEEE)
  987.  *                or is infinite (IEEE)
  988.  *      eisnan (e)              1 if e is a NaN
  989.  *
  990.  *
  991.  *        Routines for internal format numbers
  992.  *
  993.  *    eaddm (ai, bi)        add significands, bi = bi + ai
  994.  *    ecleaz (ei)        ei = 0
  995.  *    ecleazs (ei)        set ei = 0 but leave its sign alone
  996.  *    ecmpm (ai, bi)        compare significands, return 1, 0, or -1
  997.  *    edivm (ai, bi)        divide  significands, bi = bi / ai
  998.  *    emdnorm (ai,l,s,exp)    normalize and round off
  999.  *    emovi (a, ai)        convert external a to internal ai
  1000.  *    emovo (ai, a)        convert internal ai to external a
  1001.  *    emovz (ai, bi)        bi = ai, low guard word of bi = 0
  1002.  *    emulm (ai, bi)        multiply significands, bi = bi * ai
  1003.  *    enormlz (ei)        left-justify the significand
  1004.  *    eshdn1 (ai)        shift significand and guards down 1 bit
  1005.  *    eshdn8 (ai)        shift down 8 bits
  1006.  *    eshdn6 (ai)        shift down 16 bits
  1007.  *    eshift (ai, n)        shift ai n bits up (or down if n < 0)
  1008.  *    eshup1 (ai)        shift significand and guards up 1 bit
  1009.  *    eshup8 (ai)        shift up 8 bits
  1010.  *    eshup6 (ai)        shift up 16 bits
  1011.  *    esubm (ai, bi)        subtract significands, bi = bi - ai
  1012.  *      eiisinf (ai)            1 if infinite
  1013.  *      eiisnan (ai)            1 if a NaN
  1014.  *      einan (ai)              set ai = NaN
  1015.  *      eiinfin (ai)            set ai = infinity
  1016.  *
  1017.  *
  1018.  * The result is always normalized and rounded to NI-4 word precision
  1019.  * after each arithmetic operation.
  1020.  *
  1021.  * Exception flags are NOT fully supported.
  1022.  *
  1023.  * Signaling NaN's are NOT supported; they are treated the same
  1024.  * as quiet NaN's.
  1025.  *
  1026.  * Define INFINITY for support of infinity; otherwise a
  1027.  * saturation arithmetic is implemented.
  1028.  *
  1029.  * Define NANS for support of Not-a-Number items; otherwise the
  1030.  * arithmetic will never produce a NaN output, and might be confused
  1031.  * by a NaN input.
  1032.  * If NaN's are supported, the output of `ecmp (a,b)' is -2 if
  1033.  * either a or b is a NaN. This means asking `if (ecmp (a,b) < 0)'
  1034.  * may not be legitimate. Use `if (ecmp (a,b) == -1)' for `less than'
  1035.  * if in doubt.
  1036.  *
  1037.  * Denormals are always supported here where appropriate (e.g., not
  1038.  * for conversion to DEC numbers).
  1039.  *
  1040.  */
  1041.  
  1042.  
  1043. /*                            mconf.h
  1044.  *
  1045.  *    Common include file for math routines
  1046.  *
  1047.  *
  1048.  *
  1049.  * SYNOPSIS:
  1050.  *
  1051.  * #include "mconf.h"
  1052.  *
  1053.  *
  1054.  *
  1055.  * DESCRIPTION:
  1056.  *
  1057.  * This file contains definitions for error codes that are
  1058.  * passed to the common error handling routine mtherr
  1059.  * (which see).
  1060.  *
  1061.  * The file also includes a conditional assembly definition
  1062.  * for the type of computer arithmetic (Intel IEEE, DEC, Motorola
  1063.  * IEEE, or UNKnown).
  1064.  *
  1065.  * For Digital Equipment PDP-11 and VAX computers, certain
  1066.  * IBM systems, and others that use numbers with a 56-bit
  1067.  * significand, the symbol DEC should be defined.  In this
  1068.  * mode, most floating point constants are given as arrays
  1069.  * of octal integers to eliminate decimal to binary conversion
  1070.  * errors that might be introduced by the compiler.
  1071.  *
  1072.  * For computers, such as IBM PC, that follow the IEEE
  1073.  * Standard for Binary Floating Point Arithmetic (ANSI/IEEE
  1074.  * Std 754-1985), the symbol IBMPC or MIEEE should be defined.
  1075.  * These numbers have 53-bit significands.  In this mode, constants
  1076.  * are provided as arrays of hexadecimal 16 bit integers.
  1077.  *
  1078.  * To accommodate other types of computer arithmetic, all
  1079.  * constants are also provided in a normal decimal radix
  1080.  * which one can hope are correctly converted to a suitable
  1081.  * format by the available C language compiler.  To invoke
  1082.  * this mode, the symbol UNK is defined.
  1083.  *
  1084.  * An important difference among these modes is a predefined
  1085.  * set of machine arithmetic constants for each.  The numbers
  1086.  * MACHEP (the machine roundoff error), MAXNUM (largest number
  1087.  * represented), and several other parameters are preset by
  1088.  * the configuration symbol.  Check the file const.c to
  1089.  * ensure that these values are correct for your computer.
  1090.  *
  1091.  * For ANSI C compatibility, define ANSIC equal to 1.  Currently
  1092.  * this affects only the atan2 function and others that use it.
  1093.  */
  1094.  
  1095. /* Constant definitions for math error conditions.  */
  1096.  
  1097. #define DOMAIN        1    /* argument domain error */
  1098. #define SING        2    /* argument singularity */
  1099. #define OVERFLOW    3    /* overflow range error */
  1100. #define UNDERFLOW    4    /* underflow range error */
  1101. #define TLOSS        5    /* total loss of precision */
  1102. #define PLOSS        6    /* partial loss of precision */
  1103. #define INVALID        7    /* NaN-producing operation */
  1104.  
  1105. /*  e type constants used by high precision check routines */
  1106.  
  1107. /*include "ehead.h"*/
  1108. /* 0.0 */
  1109. unsigned EMUSHORT ezero[NE] =
  1110. {
  1111.   0, 0000000, 0000000, 0000000, 0000000, 0000000,};
  1112. extern unsigned EMUSHORT ezero[];
  1113.  
  1114. /* 5.0E-1 */
  1115. unsigned EMUSHORT ehalf[NE] =
  1116. {
  1117.   0, 0000000, 0000000, 0000000, 0100000, 0x3ffe,};
  1118. extern unsigned EMUSHORT ehalf[];
  1119.  
  1120. /* 1.0E0 */
  1121. unsigned EMUSHORT eone[NE] =
  1122. {
  1123.   0, 0000000, 0000000, 0000000, 0100000, 0x3fff,};
  1124. extern unsigned EMUSHORT eone[];
  1125.  
  1126. /* 2.0E0 */
  1127. unsigned EMUSHORT etwo[NE] =
  1128. {
  1129.   0, 0000000, 0000000, 0000000, 0100000, 0040000,};
  1130. extern unsigned EMUSHORT etwo[];
  1131.  
  1132. /* 3.2E1 */
  1133. unsigned EMUSHORT e32[NE] =
  1134. {
  1135.   0, 0000000, 0000000, 0000000, 0100000, 0040004,};
  1136. extern unsigned EMUSHORT e32[];
  1137.  
  1138. /* 6.93147180559945309417232121458176568075500134360255E-1 */
  1139. unsigned EMUSHORT elog2[NE] =
  1140. {
  1141.   0xc9e4, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
  1142. extern unsigned EMUSHORT elog2[];
  1143.  
  1144. /* 1.41421356237309504880168872420969807856967187537695E0 */
  1145. unsigned EMUSHORT esqrt2[NE] =
  1146. {
  1147.   0x597e, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
  1148. extern unsigned EMUSHORT esqrt2[];
  1149.  
  1150. /* 2/sqrt (PI) =
  1151.  * 1.12837916709551257389615890312154517168810125865800E0 */
  1152. unsigned EMUSHORT eoneopi[NE] =
  1153. {
  1154.   0x71d5, 0x688d, 0012333, 0135202, 0110156, 0x3fff,};
  1155. extern unsigned EMUSHORT eoneopi[];
  1156.  
  1157. /* 3.14159265358979323846264338327950288419716939937511E0 */
  1158. unsigned EMUSHORT epi[NE] =
  1159. {
  1160.   0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
  1161. extern unsigned EMUSHORT epi[];
  1162.  
  1163. /* 5.7721566490153286060651209008240243104215933593992E-1 */
  1164. unsigned EMUSHORT eeul[NE] =
  1165. {
  1166.   0xd1be, 0xc7a4, 0076660, 0063743, 0111704, 0x3ffe,};
  1167. extern unsigned EMUSHORT eeul[];
  1168.  
  1169. /*
  1170. include "ehead.h"
  1171. include "mconf.h"
  1172. */
  1173.  
  1174.  
  1175.  
  1176. /* Control register for rounding precision.
  1177.  * This can be set to 80 (if NE=6), 64, 56, 53, or 24 bits.
  1178.  */
  1179. int rndprc = NBITS;
  1180. extern int rndprc;
  1181.  
  1182. void eaddm (), esubm (), emdnorm (), asctoeg ();
  1183. static void toe24 (), toe53 (), toe64 ();
  1184. void eremain (), einit (), eiremain ();
  1185. int ecmpm (), edivm (), emulm ();
  1186. void emovi (), emovo (), emovz (), ecleaz (), ecleazs (), eadd1 ();
  1187. void etodec (), todec (), dectoe ();
  1188.  
  1189.  
  1190.  
  1191.  
  1192. void 
  1193. einit ()
  1194. {
  1195. }
  1196.  
  1197. /*
  1198. ; Clear out entire external format number.
  1199. ;
  1200. ; unsigned EMUSHORT x[];
  1201. ; eclear (x);
  1202. */
  1203.  
  1204. void 
  1205. eclear (x)
  1206.      register unsigned EMUSHORT *x;
  1207. {
  1208.   register int i;
  1209.  
  1210.   for (i = 0; i < NE; i++)
  1211.     *x++ = 0;
  1212. }
  1213.  
  1214.  
  1215.  
  1216. /* Move external format number from a to b.
  1217.  *
  1218.  * emov (a, b);
  1219.  */
  1220.  
  1221. void 
  1222. emov (a, b)
  1223.      register unsigned EMUSHORT *a, *b;
  1224. {
  1225.   register int i;
  1226.  
  1227.   for (i = 0; i < NE; i++)
  1228.     *b++ = *a++;
  1229. }
  1230.  
  1231.  
  1232. /*
  1233. ;    Absolute value of external format number
  1234. ;
  1235. ;    EMUSHORT x[NE];
  1236. ;    eabs (x);
  1237. */
  1238.  
  1239. void 
  1240. eabs (x)
  1241.      unsigned EMUSHORT x[];    /* x is the memory address of a short */
  1242. {
  1243.  
  1244.   x[NE - 1] &= 0x7fff;        /* sign is top bit of last word of external format */
  1245. }
  1246.  
  1247.  
  1248.  
  1249.  
  1250. /*
  1251. ;    Negate external format number
  1252. ;
  1253. ;    unsigned EMUSHORT x[NE];
  1254. ;    eneg (x);
  1255. */
  1256.  
  1257. void 
  1258. eneg (x)
  1259.      unsigned EMUSHORT x[];
  1260. {
  1261.  
  1262. #ifdef NANS
  1263.   if (eisnan (x))
  1264.     return;
  1265. #endif
  1266.   x[NE - 1] ^= 0x8000;        /* Toggle the sign bit */
  1267. }
  1268.  
  1269.  
  1270.  
  1271. /* Return 1 if external format number is negative,
  1272.  * else return zero, including when it is a NaN.
  1273.  */
  1274. int 
  1275. eisneg (x)
  1276.      unsigned EMUSHORT x[];
  1277. {
  1278.  
  1279. #ifdef NANS
  1280.   if (eisnan (x))
  1281.     return (0);
  1282. #endif
  1283.   if (x[NE - 1] & 0x8000)
  1284.     return (1);
  1285.   else
  1286.     return (0);
  1287. }
  1288.  
  1289.  
  1290. /* Return 1 if external format number is infinity.
  1291.  * else return zero.
  1292.  */
  1293. int 
  1294. eisinf (x)
  1295.      unsigned EMUSHORT x[];
  1296. {
  1297.  
  1298. #ifdef NANS
  1299.   if (eisnan (x))
  1300.     return (0);
  1301. #endif
  1302.   if ((x[NE - 1] & 0x7fff) == 0x7fff)
  1303.     return (1);
  1304.   else
  1305.     return (0);
  1306. }
  1307.  
  1308.  
  1309. /* Check if e-type number is not a number.
  1310.    The bit pattern is one that we defined, so we know for sure how to
  1311.    detect it.  */
  1312.  
  1313. int 
  1314. eisnan (x)
  1315.      unsigned EMUSHORT x[];
  1316. {
  1317.  
  1318. #ifdef NANS
  1319.   int i;
  1320. /* NaN has maximum exponent */
  1321.   if ((x[NE - 1] & 0x7fff) != 0x7fff)
  1322.     return (0);
  1323. /* ... and non-zero significand field. */
  1324.   for (i = 0; i < NE - 1; i++)
  1325.     {
  1326.       if (*x++ != 0)
  1327.         return (1);
  1328.     }
  1329. #endif
  1330.   return (0);
  1331. }
  1332.  
  1333. /*  Fill external format number with infinity pattern (IEEE)
  1334.     or largest possible number (non-IEEE).
  1335.     Before calling einfin, you should either call eclear 
  1336.     or set up the sign bit by hand.  */
  1337.  
  1338. void 
  1339. einfin (x)
  1340.      register unsigned EMUSHORT *x;
  1341. {
  1342.   register int i;
  1343.  
  1344. #ifdef INFINITY
  1345.   for (i = 0; i < NE - 1; i++)
  1346.     *x++ = 0;
  1347.   *x |= 32767;
  1348. #else
  1349.   for (i = 0; i < NE - 1; i++)
  1350.     *x++ = 0xffff;
  1351.   *x |= 32766;
  1352.   if (rndprc < NBITS)
  1353.     {
  1354.       if (rndprc == 64)
  1355.     {
  1356.       *(x - 5) = 0;
  1357.     }
  1358.       if (rndprc == 53)
  1359.     {
  1360.       *(x - 4) = 0xf800;
  1361.     }
  1362.       else
  1363.     {
  1364.       *(x - 4) = 0;
  1365.       *(x - 3) = 0;
  1366.       *(x - 2) = 0xff00;
  1367.     }
  1368.     }
  1369. #endif
  1370. }
  1371.  
  1372.  
  1373. /* Output an e-type NaN.
  1374.    This generates Intel's quiet NaN pattern for extended real.
  1375.    The exponent is 7fff, the leading mantissa word is c000.  */
  1376.  
  1377. void 
  1378. enan (x)
  1379.      register unsigned EMUSHORT *x;
  1380. {
  1381.   register int i;
  1382.  
  1383.   for (i = 0; i < NE - 2; i++)
  1384.     *x++ = 0;
  1385.   *x++ = 0xc000;
  1386.   *x = 0x7fff;
  1387. }
  1388.  
  1389.  
  1390. /* Move in external format number,
  1391.  * converting it to internal format.
  1392.  */
  1393. void 
  1394. emovi (a, b)
  1395.      unsigned EMUSHORT *a, *b;
  1396. {
  1397.   register unsigned EMUSHORT *p, *q;
  1398.   int i;
  1399.  
  1400.   q = b;
  1401.   p = a + (NE - 1);        /* point to last word of external number */
  1402.   /* get the sign bit */
  1403.   if (*p & 0x8000)
  1404.     *q++ = 0xffff;
  1405.   else
  1406.     *q++ = 0;
  1407.   /* get the exponent */
  1408.   *q = *p--;
  1409.   *q++ &= 0x7fff;        /* delete the sign bit */
  1410. #ifdef INFINITY
  1411.   if ((*(q - 1) & 0x7fff) == 0x7fff)
  1412.     {
  1413. #ifdef NANS
  1414.       if (eisnan (a))
  1415.     {
  1416.       *q++ = 0;
  1417.       for (i = 3; i < NI; i++)
  1418.         *q++ = *p--;
  1419.       return;
  1420.     }
  1421. #endif
  1422.       for (i = 2; i < NI; i++)
  1423.     *q++ = 0;
  1424.       return;
  1425.     }
  1426. #endif
  1427.   /* clear high guard word */
  1428.   *q++ = 0;
  1429.   /* move in the significand */
  1430.   for (i = 0; i < NE - 1; i++)
  1431.     *q++ = *p--;
  1432.   /* clear low guard word */
  1433.   *q = 0;
  1434. }
  1435.  
  1436.  
  1437. /* Move internal format number out,
  1438.  * converting it to external format.
  1439.  */
  1440. void 
  1441. emovo (a, b)
  1442.      unsigned EMUSHORT *a, *b;
  1443. {
  1444.   register unsigned EMUSHORT *p, *q;
  1445.   unsigned EMUSHORT i;
  1446.  
  1447.   p = a;
  1448.   q = b + (NE - 1);        /* point to output exponent */
  1449.   /* combine sign and exponent */
  1450.   i = *p++;
  1451.   if (i)
  1452.     *q-- = *p++ | 0x8000;
  1453.   else
  1454.     *q-- = *p++;
  1455. #ifdef INFINITY
  1456.   if (*(p - 1) == 0x7fff)
  1457.     {
  1458. #ifdef NANS
  1459.       if (eiisnan (a))
  1460.     {
  1461.       enan (b);
  1462.       return;
  1463.     }
  1464. #endif
  1465.       einfin (b);
  1466.       return;
  1467.     }
  1468. #endif
  1469.   /* skip over guard word */
  1470.   ++p;
  1471.   /* move the significand */
  1472.   for (i = 0; i < NE - 1; i++)
  1473.     *q-- = *p++;
  1474. }
  1475.  
  1476.  
  1477.  
  1478.  
  1479. /* Clear out internal format number.
  1480.  */
  1481.  
  1482. void 
  1483. ecleaz (xi)
  1484.      register unsigned EMUSHORT *xi;
  1485. {
  1486.   register int i;
  1487.  
  1488.   for (i = 0; i < NI; i++)
  1489.     *xi++ = 0;
  1490. }
  1491.  
  1492.  
  1493. /* same, but don't touch the sign. */
  1494.  
  1495. void 
  1496. ecleazs (xi)
  1497.      register unsigned EMUSHORT *xi;
  1498. {
  1499.   register int i;
  1500.  
  1501.   ++xi;
  1502.   for (i = 0; i < NI - 1; i++)
  1503.     *xi++ = 0;
  1504. }
  1505.  
  1506.  
  1507.  
  1508. /* Move internal format number from a to b.
  1509.  */
  1510. void 
  1511. emovz (a, b)
  1512.      register unsigned EMUSHORT *a, *b;
  1513. {
  1514.   register int i;
  1515.  
  1516.   for (i = 0; i < NI - 1; i++)
  1517.     *b++ = *a++;
  1518.   /* clear low guard word */
  1519.   *b = 0;
  1520. }
  1521.  
  1522. /* Generate internal format NaN.
  1523.    The explicit pattern for this is maximum exponent and
  1524.    top two significand bits set.  */
  1525.  
  1526. void
  1527. einan (x)
  1528.      unsigned EMUSHORT x[];
  1529. {
  1530.  
  1531.   ecleaz (x);
  1532.   x[E] = 0x7fff;
  1533.   x[M + 1] = 0xc000;
  1534. }
  1535.  
  1536. /* Return nonzero if internal format number is a NaN. */
  1537.  
  1538. int 
  1539. eiisnan (x)
  1540.      unsigned EMUSHORT x[];
  1541. {
  1542.   int i;
  1543.  
  1544.   if ((x[E] & 0x7fff) == 0x7fff)
  1545.     {
  1546.       for (i = M + 1; i < NI; i++)
  1547.     {
  1548.       if (x[i] != 0)
  1549.         return (1);
  1550.     }
  1551.     }
  1552.   return (0);
  1553. }
  1554.  
  1555. /* Fill internal format number with infinity pattern.
  1556.    This has maximum exponent and significand all zeros.  */
  1557.  
  1558. void
  1559. eiinfin (x)
  1560.      unsigned EMUSHORT x[];
  1561. {
  1562.  
  1563.   ecleaz (x);
  1564.   x[E] = 0x7fff;
  1565. }
  1566.  
  1567. /* Return nonzero if internal format number is infinite. */
  1568.  
  1569. int 
  1570. eiisinf (x)
  1571.      unsigned EMUSHORT x[];
  1572. {
  1573.  
  1574. #ifdef NANS
  1575.   if (eiisnan (x))
  1576.     return (0);
  1577. #endif
  1578.   if ((x[E] & 0x7fff) == 0x7fff)
  1579.     return (1);
  1580.   return (0);
  1581. }
  1582.  
  1583.  
  1584. /*
  1585. ;    Compare significands of numbers in internal format.
  1586. ;    Guard words are included in the comparison.
  1587. ;
  1588. ;    unsigned EMUSHORT a[NI], b[NI];
  1589. ;    cmpm (a, b);
  1590. ;
  1591. ;    for the significands:
  1592. ;    returns    +1 if a > b
  1593. ;         0 if a == b
  1594. ;        -1 if a < b
  1595. */
  1596. int
  1597. ecmpm (a, b)
  1598.      register unsigned EMUSHORT *a, *b;
  1599. {
  1600.   int i;
  1601.  
  1602.   a += M;            /* skip up to significand area */
  1603.   b += M;
  1604.   for (i = M; i < NI; i++)
  1605.     {
  1606.       if (*a++ != *b++)
  1607.     goto difrnt;
  1608.     }
  1609.   return (0);
  1610.  
  1611.  difrnt:
  1612.   if (*(--a) > *(--b))
  1613.     return (1);
  1614.   else
  1615.     return (-1);
  1616. }
  1617.  
  1618.  
  1619. /*
  1620. ;    Shift significand down by 1 bit
  1621. */
  1622.  
  1623. void 
  1624. eshdn1 (x)
  1625.      register unsigned EMUSHORT *x;
  1626. {
  1627.   register unsigned EMUSHORT bits;
  1628.   int i;
  1629.  
  1630.   x += M;            /* point to significand area */
  1631.  
  1632.   bits = 0;
  1633.   for (i = M; i < NI; i++)
  1634.     {
  1635.       if (*x & 1)
  1636.     bits |= 1;
  1637.       *x >>= 1;
  1638.       if (bits & 2)
  1639.     *x |= 0x8000;
  1640.       bits <<= 1;
  1641.       ++x;
  1642.     }
  1643. }
  1644.  
  1645.  
  1646.  
  1647. /*
  1648. ;    Shift significand up by 1 bit
  1649. */
  1650.  
  1651. void 
  1652. eshup1 (x)
  1653.      register unsigned EMUSHORT *x;
  1654. {
  1655.   register unsigned EMUSHORT bits;
  1656.   int i;
  1657.  
  1658.   x += NI - 1;
  1659.   bits = 0;
  1660.  
  1661.   for (i = M; i < NI; i++)
  1662.     {
  1663.       if (*x & 0x8000)
  1664.     bits |= 1;
  1665.       *x <<= 1;
  1666.       if (bits & 2)
  1667.     *x |= 1;
  1668.       bits <<= 1;
  1669.       --x;
  1670.     }
  1671. }
  1672.  
  1673.  
  1674.  
  1675. /*
  1676. ;    Shift significand down by 8 bits
  1677. */
  1678.  
  1679. void 
  1680. eshdn8 (x)
  1681.      register unsigned EMUSHORT *x;
  1682. {
  1683.   register unsigned EMUSHORT newbyt, oldbyt;
  1684.   int i;
  1685.  
  1686.   x += M;
  1687.   oldbyt = 0;
  1688.   for (i = M; i < NI; i++)
  1689.     {
  1690.       newbyt = *x << 8;
  1691.       *x >>= 8;
  1692.       *x |= oldbyt;
  1693.       oldbyt = newbyt;
  1694.       ++x;
  1695.     }
  1696. }
  1697.  
  1698. /*
  1699. ;    Shift significand up by 8 bits
  1700. */
  1701.  
  1702. void 
  1703. eshup8 (x)
  1704.      register unsigned EMUSHORT *x;
  1705. {
  1706.   int i;
  1707.   register unsigned EMUSHORT newbyt, oldbyt;
  1708.  
  1709.   x += NI - 1;
  1710.   oldbyt = 0;
  1711.  
  1712.   for (i = M; i < NI; i++)
  1713.     {
  1714.       newbyt = *x >> 8;
  1715.       *x <<= 8;
  1716.       *x |= oldbyt;
  1717.       oldbyt = newbyt;
  1718.       --x;
  1719.     }
  1720. }
  1721.  
  1722. /*
  1723. ;    Shift significand up by 16 bits
  1724. */
  1725.  
  1726. void 
  1727. eshup6 (x)
  1728.      register unsigned EMUSHORT *x;
  1729. {
  1730.   int i;
  1731.   register unsigned EMUSHORT *p;
  1732.  
  1733.   p = x + M;
  1734.   x += M + 1;
  1735.  
  1736.   for (i = M; i < NI - 1; i++)
  1737.     *p++ = *x++;
  1738.  
  1739.   *p = 0;
  1740. }
  1741.  
  1742. /*
  1743. ;    Shift significand down by 16 bits
  1744. */
  1745.  
  1746. void 
  1747. eshdn6 (x)
  1748.      register unsigned EMUSHORT *x;
  1749. {
  1750.   int i;
  1751.   register unsigned EMUSHORT *p;
  1752.  
  1753.   x += NI - 1;
  1754.   p = x + 1;
  1755.  
  1756.   for (i = M; i < NI - 1; i++)
  1757.     *(--p) = *(--x);
  1758.  
  1759.   *(--p) = 0;
  1760. }
  1761.  
  1762. /*
  1763. ;    Add significands
  1764. ;    x + y replaces y
  1765. */
  1766.  
  1767. void 
  1768. eaddm (x, y)
  1769.      unsigned EMUSHORT *x, *y;
  1770. {
  1771.   register unsigned EMULONG a;
  1772.   int i;
  1773.   unsigned int carry;
  1774.  
  1775.   x += NI - 1;
  1776.   y += NI - 1;
  1777.   carry = 0;
  1778.   for (i = M; i < NI; i++)
  1779.     {
  1780.       a = (unsigned EMULONG) (*x) + (unsigned EMULONG) (*y) + carry;
  1781.       if (a & 0x10000)
  1782.     carry = 1;
  1783.       else
  1784.     carry = 0;
  1785.       *y = (unsigned EMUSHORT) a;
  1786.       --x;
  1787.       --y;
  1788.     }
  1789. }
  1790.  
  1791. /*
  1792. ;    Subtract significands
  1793. ;    y - x replaces y
  1794. */
  1795.  
  1796. void 
  1797. esubm (x, y)
  1798.      unsigned EMUSHORT *x, *y;
  1799. {
  1800.   unsigned EMULONG a;
  1801.   int i;
  1802.   unsigned int carry;
  1803.  
  1804.   x += NI - 1;
  1805.   y += NI - 1;
  1806.   carry = 0;
  1807.   for (i = M; i < NI; i++)
  1808.     {
  1809.       a = (unsigned EMULONG) (*y) - (unsigned EMULONG) (*x) - carry;
  1810.       if (a & 0x10000)
  1811.     carry = 1;
  1812.       else
  1813.     carry = 0;
  1814.       *y = (unsigned EMUSHORT) a;
  1815.       --x;
  1816.       --y;
  1817.     }
  1818. }
  1819.  
  1820.  
  1821. /* Divide significands */
  1822.  
  1823. static unsigned EMUSHORT equot[NI];
  1824.  
  1825. int 
  1826. edivm (den, num)
  1827.      unsigned EMUSHORT den[], num[];
  1828. {
  1829.   int i;
  1830.   register unsigned EMUSHORT *p, *q;
  1831.   unsigned EMUSHORT j;
  1832.  
  1833.   p = &equot[0];
  1834.   *p++ = num[0];
  1835.   *p++ = num[1];
  1836.  
  1837.   for (i = M; i < NI; i++)
  1838.     {
  1839.       *p++ = 0;
  1840.     }
  1841.  
  1842.   /* Use faster compare and subtraction if denominator
  1843.    * has only 15 bits of significance.
  1844.    */
  1845.   p = &den[M + 2];
  1846.   if (*p++ == 0)
  1847.     {
  1848.       for (i = M + 3; i < NI; i++)
  1849.     {
  1850.       if (*p++ != 0)
  1851.         goto fulldiv;
  1852.     }
  1853.       if ((den[M + 1] & 1) != 0)
  1854.     goto fulldiv;
  1855.       eshdn1 (num);
  1856.       eshdn1 (den);
  1857.  
  1858.       p = &den[M + 1];
  1859.       q = &num[M + 1];
  1860.  
  1861.       for (i = 0; i < NBITS + 2; i++)
  1862.     {
  1863.       if (*p <= *q)
  1864.         {
  1865.           *q -= *p;
  1866.           j = 1;
  1867.         }
  1868.       else
  1869.         {
  1870.           j = 0;
  1871.         }
  1872.       eshup1 (equot);
  1873.       equot[NI - 2] |= j;
  1874.       eshup1 (num);
  1875.     }
  1876.       goto divdon;
  1877.     }
  1878.  
  1879.   /* The number of quotient bits to calculate is
  1880.    * NBITS + 1 scaling guard bit + 1 roundoff bit.
  1881.    */
  1882.  fulldiv:
  1883.  
  1884.   p = &equot[NI - 2];
  1885.   for (i = 0; i < NBITS + 2; i++)
  1886.     {
  1887.       if (ecmpm (den, num) <= 0)
  1888.     {
  1889.       esubm (den, num);
  1890.       j = 1;        /* quotient bit = 1 */
  1891.     }
  1892.       else
  1893.     j = 0;
  1894.       eshup1 (equot);
  1895.       *p |= j;
  1896.       eshup1 (num);
  1897.     }
  1898.  
  1899.  divdon:
  1900.  
  1901.   eshdn1 (equot);
  1902.   eshdn1 (equot);
  1903.  
  1904.   /* test for nonzero remainder after roundoff bit */
  1905.   p = &num[M];
  1906.   j = 0;
  1907.   for (i = M; i < NI; i++)
  1908.     {
  1909.       j |= *p++;
  1910.     }
  1911.   if (j)
  1912.     j = 1;
  1913.  
  1914.  
  1915.   for (i = 0; i < NI; i++)
  1916.     num[i] = equot[i];
  1917.   return ((int) j);
  1918. }
  1919.  
  1920.  
  1921. /* Multiply significands */
  1922. int 
  1923. emulm (a, b)
  1924.      unsigned EMUSHORT a[], b[];
  1925. {
  1926.   unsigned EMUSHORT *p, *q;
  1927.   int i, j, k;
  1928.  
  1929.   equot[0] = b[0];
  1930.   equot[1] = b[1];
  1931.   for (i = M; i < NI; i++)
  1932.     equot[i] = 0;
  1933.  
  1934.   p = &a[NI - 2];
  1935.   k = NBITS;
  1936.   while (*p == 0)        /* significand is not supposed to be all zero */
  1937.     {
  1938.       eshdn6 (a);
  1939.       k -= 16;
  1940.     }
  1941.   if ((*p & 0xff) == 0)
  1942.     {
  1943.       eshdn8 (a);
  1944.       k -= 8;
  1945.     }
  1946.  
  1947.   q = &equot[NI - 1];
  1948.   j = 0;
  1949.   for (i = 0; i < k; i++)
  1950.     {
  1951.       if (*p & 1)
  1952.     eaddm (b, equot);
  1953.       /* remember if there were any nonzero bits shifted out */
  1954.       if (*q & 1)
  1955.     j |= 1;
  1956.       eshdn1 (a);
  1957.       eshdn1 (equot);
  1958.     }
  1959.  
  1960.   for (i = 0; i < NI; i++)
  1961.     b[i] = equot[i];
  1962.  
  1963.   /* return flag for lost nonzero bits */
  1964.   return (j);
  1965. }
  1966.  
  1967.  
  1968.  
  1969. /*
  1970.  * Normalize and round off.
  1971.  *
  1972.  * The internal format number to be rounded is "s".
  1973.  * Input "lost" indicates whether or not the number is exact.
  1974.  * This is the so-called sticky bit.
  1975.  *
  1976.  * Input "subflg" indicates whether the number was obtained
  1977.  * by a subtraction operation.  In that case if lost is nonzero
  1978.  * then the number is slightly smaller than indicated.
  1979.  *
  1980.  * Input "exp" is the biased exponent, which may be negative.
  1981.  * the exponent field of "s" is ignored but is replaced by
  1982.  * "exp" as adjusted by normalization and rounding.
  1983.  *
  1984.  * Input "rcntrl" is the rounding control.
  1985.  */
  1986.  
  1987. static int rlast = -1;
  1988. static int rw = 0;
  1989. static unsigned EMUSHORT rmsk = 0;
  1990. static unsigned EMUSHORT rmbit = 0;
  1991. static unsigned EMUSHORT rebit = 0;
  1992. static int re = 0;
  1993. static unsigned EMUSHORT rbit[NI];
  1994.  
  1995. void 
  1996. emdnorm (s, lost, subflg, exp, rcntrl)
  1997.      unsigned EMUSHORT s[];
  1998.      int lost;
  1999.      int subflg;
  2000.      EMULONG exp;
  2001.      int rcntrl;
  2002. {
  2003.   int i, j;
  2004.   unsigned EMUSHORT r;
  2005.  
  2006.   /* Normalize */
  2007.   j = enormlz (s);
  2008.  
  2009.   /* a blank significand could mean either zero or infinity. */
  2010. #ifndef INFINITY
  2011.   if (j > NBITS)
  2012.     {
  2013.       ecleazs (s);
  2014.       return;
  2015.     }
  2016. #endif
  2017.   exp -= j;
  2018. #ifndef INFINITY
  2019.   if (exp >= 32767L)
  2020.     goto overf;
  2021. #else
  2022.   if ((j > NBITS) && (exp < 32767))
  2023.     {
  2024.       ecleazs (s);
  2025.       return;
  2026.     }
  2027. #endif
  2028.   if (exp < 0L)
  2029.     {
  2030.       if (exp > (EMULONG) (-NBITS - 1))
  2031.     {
  2032.       j = (int) exp;
  2033.       i = eshift (s, j);
  2034.       if (i)
  2035.         lost = 1;
  2036.     }
  2037.       else
  2038.     {
  2039.       ecleazs (s);
  2040.       return;
  2041.     }
  2042.     }
  2043.   /* Round off, unless told not to by rcntrl. */
  2044.   if (rcntrl == 0)
  2045.     goto mdfin;
  2046.   /* Set up rounding parameters if the control register changed. */
  2047.   if (rndprc != rlast)
  2048.     {
  2049.       ecleaz (rbit);
  2050.       switch (rndprc)
  2051.     {
  2052.     default:
  2053.     case NBITS:
  2054.       rw = NI - 1;        /* low guard word */
  2055.       rmsk = 0xffff;
  2056.       rmbit = 0x8000;
  2057.       rbit[rw - 1] = 1;
  2058.       re = NI - 2;
  2059.       rebit = 1;
  2060.       break;
  2061.     case 64:
  2062.       rw = 7;
  2063.       rmsk = 0xffff;
  2064.       rmbit = 0x8000;
  2065.       rbit[rw - 1] = 1;
  2066.       re = rw - 1;
  2067.       rebit = 1;
  2068.       break;
  2069.       /* For DEC arithmetic */
  2070.     case 56:
  2071.       rw = 6;
  2072.       rmsk = 0xff;
  2073.       rmbit = 0x80;
  2074.       rbit[rw] = 0x100;
  2075.       re = rw;
  2076.       rebit = 0x100;
  2077.       break;
  2078.     case 53:
  2079.       rw = 6;
  2080.       rmsk = 0x7ff;
  2081.       rmbit = 0x0400;
  2082.       rbit[rw] = 0x800;
  2083.       re = rw;
  2084.       rebit = 0x800;
  2085.       break;
  2086.     case 24:
  2087.       rw = 4;
  2088.       rmsk = 0xff;
  2089.       rmbit = 0x80;
  2090.       rbit[rw] = 0x100;
  2091.       re = rw;
  2092.       rebit = 0x100;
  2093.       break;
  2094.     }
  2095.       rlast = rndprc;
  2096.     }
  2097.  
  2098.   if (rndprc >= 64)
  2099.     {
  2100.       r = s[rw] & rmsk;
  2101.       if (rndprc == 64)
  2102.     {
  2103.       i = rw + 1;
  2104.       while (i < NI)
  2105.         {
  2106.           if (s[i])
  2107.         r |= 1;
  2108.           s[i] = 0;
  2109.           ++i;
  2110.         }
  2111.     }
  2112.     }
  2113.   else
  2114.     {
  2115.       if (exp <= 0)
  2116.     eshdn1 (s);
  2117.       r = s[rw] & rmsk;
  2118.       /* These tests assume NI = 8 */
  2119.       i = rw + 1;
  2120.       while (i < NI)
  2121.     {
  2122.       if (s[i])
  2123.         r |= 1;
  2124.       s[i] = 0;
  2125.       ++i;
  2126.     }
  2127.       /*
  2128.      if (rndprc == 24)
  2129.      {
  2130.      if (s[5] || s[6])
  2131.      r |= 1;
  2132.      s[5] = 0;
  2133.      s[6] = 0;
  2134.      }
  2135.      */
  2136.     }
  2137.   s[rw] &= ~rmsk;
  2138.   if ((r & rmbit) != 0)
  2139.     {
  2140.       if (r == rmbit)
  2141.     {
  2142.       if (lost == 0)
  2143.         {            /* round to even */
  2144.           if ((s[re] & rebit) == 0)
  2145.         goto mddone;
  2146.         }
  2147.       else
  2148.         {
  2149.           if (subflg != 0)
  2150.         goto mddone;
  2151.         }
  2152.     }
  2153.       eaddm (rbit, s);
  2154.     }
  2155.  mddone:
  2156.   if ((rndprc < 64) && (exp <= 0))
  2157.     {
  2158.       eshup1 (s);
  2159.     }
  2160.   if (s[2] != 0)
  2161.     {                /* overflow on roundoff */
  2162.       eshdn1 (s);
  2163.       exp += 1;
  2164.     }
  2165.  mdfin:
  2166.   s[NI - 1] = 0;
  2167.   if (exp >= 32767L)
  2168.     {
  2169. #ifndef INFINITY
  2170.     overf:
  2171. #endif
  2172. #ifdef INFINITY
  2173.       s[1] = 32767;
  2174.       for (i = 2; i < NI - 1; i++)
  2175.     s[i] = 0;
  2176.       if (extra_warnings)
  2177.     warning ("floating point overflow");
  2178. #else
  2179.       s[1] = 32766;
  2180.       s[2] = 0;
  2181.       for (i = M + 1; i < NI - 1; i++)
  2182.     s[i] = 0xffff;
  2183.       s[NI - 1] = 0;
  2184.       if (rndprc < 64)
  2185.     {
  2186.       s[rw] &= ~rmsk;
  2187.       if (rndprc == 24)
  2188.         {
  2189.           s[5] = 0;
  2190.           s[6] = 0;
  2191.         }
  2192.     }
  2193. #endif
  2194.       return;
  2195.     }
  2196.   if (exp < 0)
  2197.     s[1] = 0;
  2198.   else
  2199.     s[1] = (unsigned EMUSHORT) exp;
  2200. }
  2201.  
  2202.  
  2203.  
  2204. /*
  2205. ;    Subtract external format numbers.
  2206. ;
  2207. ;    unsigned EMUSHORT a[NE], b[NE], c[NE];
  2208. ;    esub (a, b, c);     c = b - a
  2209. */
  2210.  
  2211. static int subflg = 0;
  2212.  
  2213. void 
  2214. esub (a, b, c)
  2215.      unsigned EMUSHORT *a, *b, *c;
  2216. {
  2217.  
  2218. #ifdef NANS
  2219.   if (eisnan (a))
  2220.     {
  2221.       emov (a, c);
  2222.       return;
  2223.     }
  2224.   if (eisnan (b))
  2225.     {
  2226.       emov (b, c);
  2227.       return;
  2228.     }
  2229. /* Infinity minus infinity is a NaN.
  2230.    Test for subtracting infinities of the same sign. */
  2231.   if (eisinf (a) && eisinf (b)
  2232.       && ((eisneg (a) ^ eisneg (b)) == 0))
  2233.     {
  2234.       mtherr ("esub", INVALID);
  2235.       enan (c);
  2236.       return;
  2237.     }
  2238. #endif
  2239.   subflg = 1;
  2240.   eadd1 (a, b, c);
  2241. }
  2242.  
  2243.  
  2244. /*
  2245. ;    Add.
  2246. ;
  2247. ;    unsigned EMUSHORT a[NE], b[NE], c[NE];
  2248. ;    eadd (a, b, c);     c = b + a
  2249. */
  2250. void 
  2251. eadd (a, b, c)
  2252.      unsigned EMUSHORT *a, *b, *c;
  2253. {
  2254.  
  2255. #ifdef NANS
  2256. /* NaN plus anything is a NaN. */
  2257.   if (eisnan (a))
  2258.     {
  2259.       emov (a, c);
  2260.       return;
  2261.     }
  2262.   if (eisnan (b))
  2263.     {
  2264.       emov (b, c);
  2265.       return;
  2266.     }
  2267. /* Infinity minus infinity is a NaN.
  2268.    Test for adding infinities of opposite signs. */
  2269.   if (eisinf (a) && eisinf (b)
  2270.       && ((eisneg (a) ^ eisneg (b)) != 0))
  2271.     {
  2272.       mtherr ("esub", INVALID);
  2273.       enan (c);
  2274.       return;
  2275.     }
  2276. #endif
  2277.   subflg = 0;
  2278.   eadd1 (a, b, c);
  2279. }
  2280.  
  2281. void 
  2282. eadd1 (a, b, c)
  2283.      unsigned EMUSHORT *a, *b, *c;
  2284. {
  2285.   unsigned EMUSHORT ai[NI], bi[NI], ci[NI];
  2286.   int i, lost, j, k;
  2287.   EMULONG lt, lta, ltb;
  2288.  
  2289. #ifdef INFINITY
  2290.   if (eisinf (a))
  2291.     {
  2292.       emov (a, c);
  2293.       if (subflg)
  2294.     eneg (c);
  2295.       return;
  2296.     }
  2297.   if (eisinf (b))
  2298.     {
  2299.       emov (b, c);
  2300.       return;
  2301.     }
  2302. #endif
  2303.   emovi (a, ai);
  2304.   emovi (b, bi);
  2305.   if (subflg)
  2306.     ai[0] = ~ai[0];
  2307.  
  2308.   /* compare exponents */
  2309.   lta = ai[E];
  2310.   ltb = bi[E];
  2311.   lt = lta - ltb;
  2312.   if (lt > 0L)
  2313.     {                /* put the larger number in bi */
  2314.       emovz (bi, ci);
  2315.       emovz (ai, bi);
  2316.       emovz (ci, ai);
  2317.       ltb = bi[E];
  2318.       lt = -lt;
  2319.     }
  2320.   lost = 0;
  2321.   if (lt != 0L)
  2322.     {
  2323.       if (lt < (EMULONG) (-NBITS - 1))
  2324.     goto done;        /* answer same as larger addend */
  2325.       k = (int) lt;
  2326.       lost = eshift (ai, k);    /* shift the smaller number down */
  2327.     }
  2328.   else
  2329.     {
  2330.       /* exponents were the same, so must compare significands */
  2331.       i = ecmpm (ai, bi);
  2332.       if (i == 0)
  2333.     {            /* the numbers are identical in magnitude */
  2334.       /* if different signs, result is zero */
  2335.       if (ai[0] != bi[0])
  2336.         {
  2337.           eclear (c);
  2338.           return;
  2339.         }
  2340.       /* if same sign, result is double */
  2341.       /* double denomalized tiny number */
  2342.       if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0))
  2343.         {
  2344.           eshup1 (bi);
  2345.           goto done;
  2346.         }
  2347.       /* add 1 to exponent unless both are zero! */
  2348.       for (j = 1; j < NI - 1; j++)
  2349.         {
  2350.           if (bi[j] != 0)
  2351.         {
  2352.           /* This could overflow, but let emovo take care of that. */
  2353.           ltb += 1;
  2354.           break;
  2355.         }
  2356.         }
  2357.       bi[E] = (unsigned EMUSHORT) ltb;
  2358.       goto done;
  2359.     }
  2360.       if (i > 0)
  2361.     {            /* put the larger number in bi */
  2362.       emovz (bi, ci);
  2363.       emovz (ai, bi);
  2364.       emovz (ci, ai);
  2365.     }
  2366.     }
  2367.   if (ai[0] == bi[0])
  2368.     {
  2369.       eaddm (ai, bi);
  2370.       subflg = 0;
  2371.     }
  2372.   else
  2373.     {
  2374.       esubm (ai, bi);
  2375.       subflg = 1;
  2376.     }
  2377.   emdnorm (bi, lost, subflg, ltb, 64);
  2378.  
  2379.  done:
  2380.   emovo (bi, c);
  2381. }
  2382.  
  2383.  
  2384.  
  2385. /*
  2386. ;    Divide.
  2387. ;
  2388. ;    unsigned EMUSHORT a[NE], b[NE], c[NE];
  2389. ;    ediv (a, b, c);    c = b / a
  2390. */
  2391. void 
  2392. ediv (a, b, c)
  2393.      unsigned EMUSHORT *a, *b, *c;
  2394. {
  2395.   unsigned EMUSHORT ai[NI], bi[NI];
  2396.   int i;
  2397.   EMULONG lt, lta, ltb;
  2398.  
  2399. #ifdef NANS
  2400. /* Return any NaN input. */
  2401.   if (eisnan (a))
  2402.     {
  2403.     emov (a, c);
  2404.     return;
  2405.     }
  2406.   if (eisnan (b))
  2407.     {
  2408.     emov (b, c);
  2409.     return;
  2410.     }
  2411. /* Zero over zero, or infinity over infinity, is a NaN. */
  2412.   if (((ecmp (a, ezero) == 0) && (ecmp (b, ezero) == 0))
  2413.       || (eisinf (a) && eisinf (b)))
  2414.     {
  2415.     mtherr ("ediv", INVALID);
  2416.     enan (c);
  2417.     return;
  2418.     }
  2419. #endif
  2420. /* Infinity over anything else is infinity. */
  2421. #ifdef INFINITY
  2422.   if (eisinf (b))
  2423.     {
  2424.       if (eisneg (a) ^ eisneg (b))
  2425.     *(c + (NE - 1)) = 0x8000;
  2426.       else
  2427.     *(c + (NE - 1)) = 0;
  2428.       einfin (c);
  2429.       return;
  2430.     }
  2431. /* Anything else over infinity is zero. */
  2432.   if (eisinf (a))
  2433.     {
  2434.       eclear (c);
  2435.       return;
  2436.     }
  2437. #endif
  2438.   emovi (a, ai);
  2439.   emovi (b, bi);
  2440.   lta = ai[E];
  2441.   ltb = bi[E];
  2442.   if (bi[E] == 0)
  2443.     {                /* See if numerator is zero. */
  2444.       for (i = 1; i < NI - 1; i++)
  2445.     {
  2446.       if (bi[i] != 0)
  2447.         {
  2448.           ltb -= enormlz (bi);
  2449.           goto dnzro1;
  2450.         }
  2451.     }
  2452.       eclear (c);
  2453.       return;
  2454.     }
  2455.  dnzro1:
  2456.  
  2457.   if (ai[E] == 0)
  2458.     {                /* possible divide by zero */
  2459.       for (i = 1; i < NI - 1; i++)
  2460.     {
  2461.       if (ai[i] != 0)
  2462.         {
  2463.           lta -= enormlz (ai);
  2464.           goto dnzro2;
  2465.         }
  2466.     }
  2467.       if (ai[0] == bi[0])
  2468.     *(c + (NE - 1)) = 0;
  2469.       else
  2470.     *(c + (NE - 1)) = 0x8000;
  2471. /* Divide by zero is not an invalid operation.
  2472.    It is a divide-by-zero operation!   */
  2473.       einfin (c);
  2474.       mtherr ("ediv", SING);
  2475.       return;
  2476.     }
  2477.  dnzro2:
  2478.  
  2479.   i = edivm (ai, bi);
  2480.   /* calculate exponent */
  2481.   lt = ltb - lta + EXONE;
  2482.   emdnorm (bi, i, 0, lt, 64);
  2483.   /* set the sign */
  2484.   if (ai[0] == bi[0])
  2485.     bi[0] = 0;
  2486.   else
  2487.     bi[0] = 0Xffff;
  2488.   emovo (bi, c);
  2489. }
  2490.  
  2491.  
  2492.  
  2493. /*
  2494. ;    Multiply.
  2495. ;
  2496. ;    unsigned EMUSHORT a[NE], b[NE], c[NE];
  2497. ;    emul (a, b, c);    c = b * a
  2498. */
  2499. void 
  2500. emul (a, b, c)
  2501.      unsigned EMUSHORT *a, *b, *c;
  2502. {
  2503.   unsigned EMUSHORT ai[NI], bi[NI];
  2504.   int i, j;
  2505.   EMULONG lt, lta, ltb;
  2506.  
  2507. #ifdef NANS
  2508. /* NaN times anything is the same NaN. */
  2509.   if (eisnan (a))
  2510.     {
  2511.     emov (a, c);
  2512.     return;
  2513.     }
  2514.   if (eisnan (b))
  2515.     {
  2516.     emov (b, c);
  2517.     return;
  2518.     }
  2519. /* Zero times infinity is a NaN. */
  2520.   if ((eisinf (a) && (ecmp (b, ezero) == 0))
  2521.       || (eisinf (b) && (ecmp (a, ezero) == 0)))
  2522.     {
  2523.     mtherr ("emul", INVALID);
  2524.     enan (c);
  2525.     return;
  2526.     }
  2527. #endif
  2528. /* Infinity times anything else is infinity. */
  2529. #ifdef INFINITY
  2530.   if (eisinf (a) || eisinf (b))
  2531.     {
  2532.       if (eisneg (a) ^ eisneg (b))
  2533.     *(c + (NE - 1)) = 0x8000;
  2534.       else
  2535.     *(c + (NE - 1)) = 0;
  2536.       einfin (c);
  2537.       return;
  2538.     }
  2539. #endif
  2540.   emovi (a, ai);
  2541.   emovi (b, bi);
  2542.   lta = ai[E];
  2543.   ltb = bi[E];
  2544.   if (ai[E] == 0)
  2545.     {
  2546.       for (i = 1; i < NI - 1; i++)
  2547.     {
  2548.       if (ai[i] != 0)
  2549.         {
  2550.           lta -= enormlz (ai);
  2551.           goto mnzer1;
  2552.         }
  2553.     }
  2554.       eclear (c);
  2555.       return;
  2556.     }
  2557.  mnzer1:
  2558.  
  2559.   if (bi[E] == 0)
  2560.     {
  2561.       for (i = 1; i < NI - 1; i++)
  2562.     {
  2563.       if (bi[i] != 0)
  2564.         {
  2565.           ltb -= enormlz (bi);
  2566.           goto mnzer2;
  2567.         }
  2568.     }
  2569.       eclear (c);
  2570.       return;
  2571.     }
  2572.  mnzer2:
  2573.  
  2574.   /* Multiply significands */
  2575.   j = emulm (ai, bi);
  2576.   /* calculate exponent */
  2577.   lt = lta + ltb - (EXONE - 1);
  2578.   emdnorm (bi, j, 0, lt, 64);
  2579.   /* calculate sign of product */
  2580.   if (ai[0] == bi[0])
  2581.     bi[0] = 0;
  2582.   else
  2583.     bi[0] = 0xffff;
  2584.   emovo (bi, c);
  2585. }
  2586.  
  2587.  
  2588.  
  2589.  
  2590. /*
  2591. ; Convert IEEE double precision to e type
  2592. ;    double d;
  2593. ;    unsigned EMUSHORT x[N+2];
  2594. ;    e53toe (&d, x);
  2595. */
  2596. void 
  2597. e53toe (pe, y)
  2598.      unsigned EMUSHORT *pe, *y;
  2599. {
  2600. #ifdef DEC
  2601.  
  2602.   dectoe (pe, y);        /* see etodec.c */
  2603.  
  2604. #else
  2605.  
  2606.   register unsigned EMUSHORT r;
  2607.   register unsigned EMUSHORT *e, *p;
  2608.   unsigned EMUSHORT yy[NI];
  2609.   int denorm, k;
  2610.  
  2611.   e = pe;
  2612.   denorm = 0;            /* flag if denormalized number */
  2613.   ecleaz (yy);
  2614. #ifdef IBMPC
  2615.   e += 3;
  2616. #endif
  2617.   r = *e;
  2618.   yy[0] = 0;
  2619.   if (r & 0x8000)
  2620.     yy[0] = 0xffff;
  2621.   yy[M] = (r & 0x0f) | 0x10;
  2622.   r &= ~0x800f;            /* strip sign and 4 significand bits */
  2623. #ifdef INFINITY
  2624.   if (r == 0x7ff0)
  2625.     {
  2626. #ifdef NANS
  2627. #ifdef IBMPC
  2628.       if (((pe[3] & 0xf) != 0) || (pe[2] != 0)
  2629.       || (pe[1] != 0) || (pe[0] != 0))
  2630.     {
  2631.       enan (y);
  2632.       return;
  2633.     }
  2634. #else
  2635.       if (((pe[0] & 0xf) != 0) || (pe[1] != 0)
  2636.       || (pe[2] != 0) || (pe[3] != 0))
  2637.     {
  2638.       enan (y);
  2639.       return;
  2640.     }
  2641. #endif
  2642. #endif  /* NANS */
  2643.       eclear (y);
  2644.       einfin (y);
  2645.       if (yy[0])
  2646.     eneg (y);
  2647.       return;
  2648.     }
  2649. #endif  /* INFINITY */
  2650.   r >>= 4;
  2651.   /* If zero exponent, then the significand is denormalized.
  2652.    * So, take back the understood high significand bit. */
  2653.   if (r == 0)
  2654.     {
  2655.       denorm = 1;
  2656.       yy[M] &= ~0x10;
  2657.     }
  2658.   r += EXONE - 01777;
  2659.   yy[E] = r;
  2660.   p = &yy[M + 1];
  2661. #ifdef IBMPC
  2662.   *p++ = *(--e);
  2663.   *p++ = *(--e);
  2664.   *p++ = *(--e);
  2665. #endif
  2666. #ifdef MIEEE
  2667.   ++e;
  2668.   *p++ = *e++;
  2669.   *p++ = *e++;
  2670.   *p++ = *e++;
  2671. #endif
  2672.   eshift (yy, -5);
  2673.   if (denorm)
  2674.     {                /* if zero exponent, then normalize the significand */
  2675.       if ((k = enormlz (yy)) > NBITS)
  2676.     ecleazs (yy);
  2677.       else
  2678.     yy[E] -= (unsigned EMUSHORT) (k - 1);
  2679.     }
  2680.   emovo (yy, y);
  2681. #endif /* not DEC */
  2682. }
  2683.  
  2684. void 
  2685. e64toe (pe, y)
  2686.      unsigned EMUSHORT *pe, *y;
  2687. {
  2688.   unsigned EMUSHORT yy[NI];
  2689.   unsigned EMUSHORT *e, *p, *q;
  2690.   int i;
  2691.  
  2692.   e = pe;
  2693.   p = yy;
  2694.   for (i = 0; i < NE - 5; i++)
  2695.     *p++ = 0;
  2696. #ifdef IBMPC
  2697.   for (i = 0; i < 5; i++)
  2698.     *p++ = *e++;
  2699. #endif
  2700. #ifdef DEC
  2701.   for (i = 0; i < 5; i++)
  2702.     *p++ = *e++;
  2703. #endif
  2704. #ifdef MIEEE
  2705.   p = &yy[0] + (NE - 1);
  2706.   *p-- = *e++;
  2707.   ++e;
  2708.   for (i = 0; i < 4; i++)
  2709.     *p-- = *e++;
  2710. #endif
  2711.   p = yy;
  2712.   q = y;
  2713. #ifdef INFINITY
  2714.   if (*p == 0x7fff)
  2715.     {
  2716. #ifdef NANS
  2717. #ifdef IBMPC
  2718.       for (i = 0; i < 4; i++)
  2719.     {
  2720.       if (pe[i] != 0)
  2721.         {
  2722.           enan (y);
  2723.           return;
  2724.         }
  2725.     }
  2726. #else
  2727.       for (i = 1; i <= 4; i++)
  2728.     {
  2729.       if (pe[i] != 0)
  2730.         {
  2731.           enan (y);
  2732.           return;
  2733.         }
  2734.     }
  2735. #endif
  2736. #endif /* NANS */
  2737.       eclear (y);
  2738.       einfin (y);
  2739.       if (*p & 0x8000)
  2740.     eneg (y);
  2741.       return;
  2742.     }
  2743. #endif  /* INFINITY */
  2744.   for (i = 0; i < NE; i++)
  2745.     *q++ = *p++;
  2746. }
  2747.  
  2748.  
  2749. /*
  2750. ; Convert IEEE single precision to e type
  2751. ;    float d;
  2752. ;    unsigned EMUSHORT x[N+2];
  2753. ;    dtox (&d, x);
  2754. */
  2755. void 
  2756. e24toe (pe, y)
  2757.      unsigned EMUSHORT *pe, *y;
  2758. {
  2759.   register unsigned EMUSHORT r;
  2760.   register unsigned EMUSHORT *e, *p;
  2761.   unsigned EMUSHORT yy[NI];
  2762.   int denorm, k;
  2763.  
  2764.   e = pe;
  2765.   denorm = 0;            /* flag if denormalized number */
  2766.   ecleaz (yy);
  2767. #ifdef IBMPC
  2768.   e += 1;
  2769. #endif
  2770. #ifdef DEC
  2771.   e += 1;
  2772. #endif
  2773.   r = *e;
  2774.   yy[0] = 0;
  2775.   if (r & 0x8000)
  2776.     yy[0] = 0xffff;
  2777.   yy[M] = (r & 0x7f) | 0200;
  2778.   r &= ~0x807f;            /* strip sign and 7 significand bits */
  2779. #ifdef INFINITY
  2780.   if (r == 0x7f80)
  2781.     {
  2782. #ifdef NANS
  2783. #ifdef MIEEE
  2784.       if (((pe[0] & 0x7f) != 0) || (pe[1] != 0))
  2785.     {
  2786.       enan (y);
  2787.       return;
  2788.     }
  2789. #else
  2790.       if (((pe[1] & 0x7f) != 0) || (pe[0] != 0))
  2791.     {
  2792.       enan (y);
  2793.       return;
  2794.     }
  2795. #endif
  2796. #endif  /* NANS */
  2797.       eclear (y);
  2798.       einfin (y);
  2799.       if (yy[0])
  2800.     eneg (y);
  2801.       return;
  2802.     }
  2803. #endif  /* INFINITY */
  2804.   r >>= 7;
  2805.   /* If zero exponent, then the significand is denormalized.
  2806.    * So, take back the understood high significand bit. */
  2807.   if (r == 0)
  2808.     {
  2809.       denorm = 1;
  2810.       yy[M] &= ~0200;
  2811.     }
  2812.   r += EXONE - 0177;
  2813.   yy[E] = r;
  2814.   p = &yy[M + 1];
  2815. #ifdef IBMPC
  2816.   *p++ = *(--e);
  2817. #endif
  2818. #ifdef DEC
  2819.   *p++ = *(--e);
  2820. #endif
  2821. #ifdef MIEEE
  2822.   ++e;
  2823.   *p++ = *e++;
  2824. #endif
  2825.   eshift (yy, -8);
  2826.   if (denorm)
  2827.     {                /* if zero exponent, then normalize the significand */
  2828.       if ((k = enormlz (yy)) > NBITS)
  2829.     ecleazs (yy);
  2830.       else
  2831.     yy[E] -= (unsigned EMUSHORT) (k - 1);
  2832.     }
  2833.   emovo (yy, y);
  2834. }
  2835.  
  2836.  
  2837. void 
  2838. etoe64 (x, e)
  2839.      unsigned EMUSHORT *x, *e;
  2840. {
  2841.   unsigned EMUSHORT xi[NI];
  2842.   EMULONG exp;
  2843.   int rndsav;
  2844.  
  2845. #ifdef NANS
  2846.   if (eisnan (x))
  2847.     {
  2848.       make_nan (e, XFmode);
  2849.       return;
  2850.     }
  2851. #endif
  2852.   emovi (x, xi);
  2853.   /* adjust exponent for offset */
  2854.   exp = (EMULONG) xi[E];
  2855. #ifdef INFINITY
  2856.   if (eisinf (x))
  2857.     goto nonorm;
  2858. #endif
  2859.   /* round off to nearest or even */
  2860.   rndsav = rndprc;
  2861.   rndprc = 64;
  2862.   emdnorm (xi, 0, 0, exp, 64);
  2863.   rndprc = rndsav;
  2864.  nonorm:
  2865.   toe64 (xi, e);
  2866. }
  2867.  
  2868. /* move out internal format to ieee long double */
  2869. static void 
  2870. toe64 (a, b)
  2871.      unsigned EMUSHORT *a, *b;
  2872. {
  2873.   register unsigned EMUSHORT *p, *q;
  2874.   unsigned EMUSHORT i;
  2875.  
  2876. #ifdef NANS
  2877.   if (eiisnan (a))
  2878.     {
  2879.       make_nan (b, XFmode);
  2880.       return;
  2881.     }
  2882. #endif
  2883.   p = a;
  2884. #ifdef MIEEE
  2885.   q = b;
  2886. #else
  2887.   q = b + 4;            /* point to output exponent */
  2888. #if LONG_DOUBLE_TYPE_SIZE == 96
  2889.   /* Clear the last two bytes of 12-byte Intel format */
  2890.   *(q+1) = 0;
  2891. #endif
  2892. #endif
  2893.  
  2894.   /* combine sign and exponent */
  2895.   i = *p++;
  2896. #ifdef MIEEE
  2897.   if (i)
  2898.     *q++ = *p++ | 0x8000;
  2899.   else
  2900.     *q++ = *p++;
  2901.   *q++ = 0;
  2902. #else
  2903.   if (i)
  2904.     *q-- = *p++ | 0x8000;
  2905.   else
  2906.     *q-- = *p++;
  2907. #endif
  2908.   /* skip over guard word */
  2909.   ++p;
  2910.   /* move the significand */
  2911. #ifdef MIEEE
  2912.   for (i = 0; i < 4; i++)
  2913.     *q++ = *p++;
  2914. #else
  2915.   for (i = 0; i < 4; i++)
  2916.     *q-- = *p++;
  2917. #endif
  2918. }
  2919.  
  2920.  
  2921. /*
  2922. ; e type to IEEE double precision
  2923. ;    double d;
  2924. ;    unsigned EMUSHORT x[NE];
  2925. ;    etoe53 (x, &d);
  2926. */
  2927.  
  2928. #ifdef DEC
  2929.  
  2930. void 
  2931. etoe53 (x, e)
  2932.      unsigned EMUSHORT *x, *e;
  2933. {
  2934.   etodec (x, e);        /* see etodec.c */
  2935. }
  2936.  
  2937. static void 
  2938. toe53 (x, y)
  2939.      unsigned EMUSHORT *x, *y;
  2940. {
  2941.   todec (x, y);
  2942. }
  2943.  
  2944. #else
  2945.  
  2946. void 
  2947. etoe53 (x, e)
  2948.      unsigned EMUSHORT *x, *e;
  2949. {
  2950.   unsigned EMUSHORT xi[NI];
  2951.   EMULONG exp;
  2952.   int rndsav;
  2953.  
  2954. #ifdef NANS
  2955.   if (eisnan (x))
  2956.     {
  2957.       make_nan (e, DFmode);
  2958.       return;
  2959.     }
  2960. #endif
  2961.   emovi (x, xi);
  2962.   /* adjust exponent for offsets */
  2963.   exp = (EMULONG) xi[E] - (EXONE - 0x3ff);
  2964. #ifdef INFINITY
  2965.   if (eisinf (x))
  2966.     goto nonorm;
  2967. #endif
  2968.   /* round off to nearest or even */
  2969.   rndsav = rndprc;
  2970.   rndprc = 53;
  2971.   emdnorm (xi, 0, 0, exp, 64);
  2972.   rndprc = rndsav;
  2973.  nonorm:
  2974.   toe53 (xi, e);
  2975. }
  2976.  
  2977.  
  2978. static void 
  2979. toe53 (x, y)
  2980.      unsigned EMUSHORT *x, *y;
  2981. {
  2982.   unsigned EMUSHORT i;
  2983.   unsigned EMUSHORT *p;
  2984.  
  2985. #ifdef NANS
  2986.   if (eiisnan (x))
  2987.     {
  2988.       make_nan (y, DFmode);
  2989.       return;
  2990.     }
  2991. #endif
  2992.   p = &x[0];
  2993. #ifdef IBMPC
  2994.   y += 3;
  2995. #endif
  2996.   *y = 0;            /* output high order */
  2997.   if (*p++)
  2998.     *y = 0x8000;        /* output sign bit */
  2999.  
  3000.   i = *p++;
  3001.   if (i >= (unsigned int) 2047)
  3002.     {                /* Saturate at largest number less than infinity. */
  3003. #ifdef INFINITY
  3004.       *y |= 0x7ff0;
  3005. #ifdef IBMPC
  3006.       *(--y) = 0;
  3007.       *(--y) = 0;
  3008.       *(--y) = 0;
  3009. #endif
  3010. #ifdef MIEEE
  3011.       ++y;
  3012.       *y++ = 0;
  3013.       *y++ = 0;
  3014.       *y++ = 0;
  3015. #endif
  3016. #else
  3017.       *y |= (unsigned EMUSHORT) 0x7fef;
  3018. #ifdef IBMPC
  3019.       *(--y) = 0xffff;
  3020.       *(--y) = 0xffff;
  3021.       *(--y) = 0xffff;
  3022. #endif
  3023. #ifdef MIEEE
  3024.       ++y;
  3025.       *y++ = 0xffff;
  3026.       *y++ = 0xffff;
  3027.       *y++ = 0xffff;
  3028. #endif
  3029. #endif
  3030.       return;
  3031.     }
  3032.   if (i == 0)
  3033.     {
  3034.       eshift (x, 4);
  3035.     }
  3036.   else
  3037.     {
  3038.       i <<= 4;
  3039.       eshift (x, 5);
  3040.     }
  3041.   i |= *p++ & (unsigned EMUSHORT) 0x0f;    /* *p = xi[M] */
  3042.   *y |= (unsigned EMUSHORT) i;    /* high order output already has sign bit set */
  3043. #ifdef IBMPC
  3044.   *(--y) = *p++;
  3045.   *(--y) = *p++;
  3046.   *(--y) = *p;
  3047. #endif
  3048. #ifdef MIEEE
  3049.   ++y;
  3050.   *y++ = *p++;
  3051.   *y++ = *p++;
  3052.   *y++ = *p++;
  3053. #endif
  3054. }
  3055.  
  3056. #endif /* not DEC */
  3057.  
  3058.  
  3059.  
  3060. /*
  3061. ; e type to IEEE single precision
  3062. ;    float d;
  3063. ;    unsigned EMUSHORT x[N+2];
  3064. ;    xtod (x, &d);
  3065. */
  3066. void 
  3067. etoe24 (x, e)
  3068.      unsigned EMUSHORT *x, *e;
  3069. {
  3070.   EMULONG exp;
  3071.   unsigned EMUSHORT xi[NI];
  3072.   int rndsav;
  3073.  
  3074. #ifdef NANS
  3075.   if (eisnan (x))
  3076.     {
  3077.       make_nan (e, SFmode);
  3078.       return;
  3079.     }
  3080. #endif
  3081.   emovi (x, xi);
  3082.   /* adjust exponent for offsets */
  3083.   exp = (EMULONG) xi[E] - (EXONE - 0177);
  3084. #ifdef INFINITY
  3085.   if (eisinf (x))
  3086.     goto nonorm;
  3087. #endif
  3088.   /* round off to nearest or even */
  3089.   rndsav = rndprc;
  3090.   rndprc = 24;
  3091.   emdnorm (xi, 0, 0, exp, 64);
  3092.   rndprc = rndsav;
  3093.  nonorm:
  3094.   toe24 (xi, e);
  3095. }
  3096.  
  3097. static void 
  3098. toe24 (x, y)
  3099.      unsigned EMUSHORT *x, *y;
  3100. {
  3101.   unsigned EMUSHORT i;
  3102.   unsigned EMUSHORT *p;
  3103.  
  3104. #ifdef NANS
  3105.   if (eiisnan (x))
  3106.     {
  3107.       make_nan (y, SFmode);
  3108.       return;
  3109.     }
  3110. #endif
  3111.   p = &x[0];
  3112. #ifdef IBMPC
  3113.   y += 1;
  3114. #endif
  3115. #ifdef DEC
  3116.   y += 1;
  3117. #endif
  3118.   *y = 0;            /* output high order */
  3119.   if (*p++)
  3120.     *y = 0x8000;        /* output sign bit */
  3121.  
  3122.   i = *p++;
  3123. /* Handle overflow cases. */
  3124.   if (i >= 255)
  3125.     {
  3126. #ifdef INFINITY
  3127.       *y |= (unsigned EMUSHORT) 0x7f80;
  3128. #ifdef IBMPC
  3129.       *(--y) = 0;
  3130. #endif
  3131. #ifdef DEC
  3132.       *(--y) = 0;
  3133. #endif
  3134. #ifdef MIEEE
  3135.       ++y;
  3136.       *y = 0;
  3137. #endif
  3138. #else  /* no INFINITY */
  3139.       *y |= (unsigned EMUSHORT) 0x7f7f;
  3140. #ifdef IBMPC
  3141.       *(--y) = 0xffff;
  3142. #endif
  3143. #ifdef DEC
  3144.       *(--y) = 0xffff;
  3145. #endif
  3146. #ifdef MIEEE
  3147.       ++y;
  3148.       *y = 0xffff;
  3149. #endif
  3150. #ifdef ERANGE
  3151.       errno = ERANGE;
  3152. #endif
  3153. #endif  /* no INFINITY */
  3154.       return;
  3155.     }
  3156.   if (i == 0)
  3157.     {
  3158.       eshift (x, 7);
  3159.     }
  3160.   else
  3161.     {
  3162.       i <<= 7;
  3163.       eshift (x, 8);
  3164.     }
  3165.   i |= *p++ & (unsigned EMUSHORT) 0x7f;    /* *p = xi[M] */
  3166.   *y |= i;            /* high order output already has sign bit set */
  3167. #ifdef IBMPC
  3168.   *(--y) = *p;
  3169. #endif
  3170. #ifdef DEC
  3171.   *(--y) = *p;
  3172. #endif
  3173. #ifdef MIEEE
  3174.   ++y;
  3175.   *y = *p;
  3176. #endif
  3177. }
  3178.  
  3179.  
  3180. /* Compare two e type numbers.
  3181.  *
  3182.  * unsigned EMUSHORT a[NE], b[NE];
  3183.  * ecmp (a, b);
  3184.  *
  3185.  *  returns +1 if a > b
  3186.  *           0 if a == b
  3187.  *          -1 if a < b
  3188.  *          -2 if either a or b is a NaN.
  3189.  */
  3190. int 
  3191. ecmp (a, b)
  3192.      unsigned EMUSHORT *a, *b;
  3193. {
  3194.   unsigned EMUSHORT ai[NI], bi[NI];
  3195.   register unsigned EMUSHORT *p, *q;
  3196.   register int i;
  3197.   int msign;
  3198.  
  3199. #ifdef NANS
  3200.   if (eisnan (a)  || eisnan (b))
  3201.       return (-2);
  3202. #endif
  3203.   emovi (a, ai);
  3204.   p = ai;
  3205.   emovi (b, bi);
  3206.   q = bi;
  3207.  
  3208.   if (*p != *q)
  3209.     {                /* the signs are different */
  3210.       /* -0 equals + 0 */
  3211.       for (i = 1; i < NI - 1; i++)
  3212.     {
  3213.       if (ai[i] != 0)
  3214.         goto nzro;
  3215.       if (bi[i] != 0)
  3216.         goto nzro;
  3217.     }
  3218.       return (0);
  3219.     nzro:
  3220.       if (*p == 0)
  3221.     return (1);
  3222.       else
  3223.     return (-1);
  3224.     }
  3225.   /* both are the same sign */
  3226.   if (*p == 0)
  3227.     msign = 1;
  3228.   else
  3229.     msign = -1;
  3230.   i = NI - 1;
  3231.   do
  3232.     {
  3233.       if (*p++ != *q++)
  3234.     {
  3235.       goto diff;
  3236.     }
  3237.     }
  3238.   while (--i > 0);
  3239.  
  3240.   return (0);            /* equality */
  3241.  
  3242.  
  3243.  
  3244.  diff:
  3245.  
  3246.   if (*(--p) > *(--q))
  3247.     return (msign);        /* p is bigger */
  3248.   else
  3249.     return (-msign);        /* p is littler */
  3250. }
  3251.  
  3252.  
  3253.  
  3254.  
  3255. /* Find nearest integer to x = floor (x + 0.5)
  3256.  *
  3257.  * unsigned EMUSHORT x[NE], y[NE]
  3258.  * eround (x, y);
  3259.  */
  3260. void 
  3261. eround (x, y)
  3262.      unsigned EMUSHORT *x, *y;
  3263. {
  3264.   eadd (ehalf, x, y);
  3265.   efloor (y, y);
  3266. }
  3267.  
  3268.  
  3269.  
  3270.  
  3271. /*
  3272. ; convert long integer to e type
  3273. ;
  3274. ;    long l;
  3275. ;    unsigned EMUSHORT x[NE];
  3276. ;    ltoe (&l, x);
  3277. ; note &l is the memory address of l
  3278. */
  3279. void 
  3280. ltoe (lp, y)
  3281.      long *lp;            /* lp is the memory address of a long integer */
  3282.      unsigned EMUSHORT *y;        /* y is the address of a short */
  3283. {
  3284.   unsigned EMUSHORT yi[NI];
  3285.   unsigned long ll;
  3286.   int k;
  3287.  
  3288.   ecleaz (yi);
  3289.   if (*lp < 0)
  3290.     {
  3291.       /* make it positive */
  3292.       ll = (unsigned long) (-(*lp));
  3293.       yi[0] = 0xffff;        /* put correct sign in the e type number */
  3294.     }
  3295.   else
  3296.     {
  3297.       ll = (unsigned long) (*lp);
  3298.     }
  3299.   /* move the long integer to yi significand area */
  3300. #if HOST_BITS_PER_LONG == 64
  3301.   yi[M] = (unsigned EMUSHORT) (ll >> 48);
  3302.   yi[M + 1] = (unsigned EMUSHORT) (ll >> 32);
  3303.   yi[M + 2] = (unsigned EMUSHORT) (ll >> 16);
  3304.   yi[M + 3] = (unsigned EMUSHORT) ll;
  3305.   yi[E] = EXONE + 47;        /* exponent if normalize shift count were 0 */
  3306. #else
  3307.   yi[M] = (unsigned EMUSHORT) (ll >> 16);
  3308.   yi[M + 1] = (unsigned EMUSHORT) ll;
  3309.   yi[E] = EXONE + 15;        /* exponent if normalize shift count were 0 */
  3310. #endif
  3311.  
  3312.   if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
  3313.     ecleaz (yi);        /* it was zero */
  3314.   else
  3315.     yi[E] -= (unsigned EMUSHORT) k;/* subtract shift count from exponent */
  3316.   emovo (yi, y);        /* output the answer */
  3317. }
  3318.  
  3319. /*
  3320. ; convert unsigned long integer to e type
  3321. ;
  3322. ;    unsigned long l;
  3323. ;    unsigned EMUSHORT x[NE];
  3324. ;    ltox (&l, x);
  3325. ; note &l is the memory address of l
  3326. */
  3327. void 
  3328. ultoe (lp, y)
  3329.      unsigned long *lp;        /* lp is the memory address of a long integer */
  3330.      unsigned EMUSHORT *y;        /* y is the address of a short */
  3331. {
  3332.   unsigned EMUSHORT yi[NI];
  3333.   unsigned long ll;
  3334.   int k;
  3335.  
  3336.   ecleaz (yi);
  3337.   ll = *lp;
  3338.  
  3339.   /* move the long integer to ayi significand area */
  3340. #if HOST_BITS_PER_LONG == 64
  3341.   yi[M] = (unsigned EMUSHORT) (ll >> 48);
  3342.   yi[M + 1] = (unsigned EMUSHORT) (ll >> 32);
  3343.   yi[M + 2] = (unsigned EMUSHORT) (ll >> 16);
  3344.   yi[M + 3] = (unsigned EMUSHORT) ll;
  3345.   yi[E] = EXONE + 47;        /* exponent if normalize shift count were 0 */
  3346. #else
  3347.   yi[M] = (unsigned EMUSHORT) (ll >> 16);
  3348.   yi[M + 1] = (unsigned EMUSHORT) ll;
  3349.   yi[E] = EXONE + 15;        /* exponent if normalize shift count were 0 */
  3350. #endif
  3351.  
  3352.   if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
  3353.     ecleaz (yi);        /* it was zero */
  3354.   else
  3355.     yi[E] -= (unsigned EMUSHORT) k;  /* subtract shift count from exponent */
  3356.   emovo (yi, y);        /* output the answer */
  3357. }
  3358.  
  3359.  
  3360. /*
  3361. ;    Find long integer and fractional parts
  3362.  
  3363. ;    long i;
  3364. ;    unsigned EMUSHORT x[NE], frac[NE];
  3365. ;    xifrac (x, &i, frac);
  3366.  
  3367.   The integer output has the sign of the input.  The fraction is
  3368. the positive fractional part of abs (x).
  3369. */
  3370. void 
  3371. eifrac (x, i, frac)
  3372.      unsigned EMUSHORT *x;
  3373.      long *i;
  3374.      unsigned EMUSHORT *frac;
  3375. {
  3376.   unsigned EMUSHORT xi[NI];
  3377.   int j, k;
  3378.   unsigned long ll;
  3379.  
  3380.   emovi (x, xi);
  3381.   k = (int) xi[E] - (EXONE - 1);
  3382.   if (k <= 0)
  3383.     {
  3384.       /* if exponent <= 0, integer = 0 and real output is fraction */
  3385.       *i = 0L;
  3386.       emovo (xi, frac);
  3387.       return;
  3388.     }
  3389.   if (k > (HOST_BITS_PER_LONG - 1))
  3390.     {
  3391.       /* long integer overflow: output large integer
  3392.      and correct fraction  */
  3393.       if (xi[0])
  3394.     *i = ((unsigned long) 1) << (HOST_BITS_PER_LONG - 1);
  3395.       else
  3396.     *i = (((unsigned long) 1) << (HOST_BITS_PER_LONG - 1)) - 1;
  3397.       eshift (xi, k);
  3398.       if (extra_warnings)
  3399.     warning ("overflow on truncation to integer");
  3400.     }
  3401.   else if (k > 16)
  3402.     {
  3403.       /* Shift more than 16 bits: first shift up k-16 mod 16,
  3404.      then shift up by 16's.  */
  3405.       j = k - ((k >> 4) << 4);
  3406.       eshift (xi, j);
  3407.       ll = xi[M];
  3408.       k -= j;
  3409.       do
  3410.     {
  3411.       eshup6 (xi);
  3412.       ll = (ll << 16) | xi[M];
  3413.     }
  3414.       while ((k -= 16) > 0);
  3415.       *i = ll;
  3416.       if (xi[0])
  3417.     *i = -(*i);
  3418.     }
  3419.   else
  3420.     {
  3421.       /* shift not more than 16 bits */
  3422.       eshift (xi, k);
  3423.       *i = (long) xi[M] & 0xffff;
  3424.       if (xi[0])
  3425.     *i = -(*i);
  3426.     }
  3427.   xi[0] = 0;
  3428.   xi[E] = EXONE - 1;
  3429.   xi[M] = 0;
  3430.   if ((k = enormlz (xi)) > NBITS)
  3431.     ecleaz (xi);
  3432.   else
  3433.     xi[E] -= (unsigned EMUSHORT) k;
  3434.  
  3435.   emovo (xi, frac);
  3436. }
  3437.  
  3438.  
  3439. /* Find unsigned long integer and fractional parts.
  3440.    A negative e type input yields integer output = 0
  3441.    but correct fraction.  */
  3442.  
  3443. void 
  3444. euifrac (x, i, frac)
  3445.      unsigned EMUSHORT *x;
  3446.      unsigned long *i;
  3447.      unsigned EMUSHORT *frac;
  3448. {
  3449.   unsigned long ll;
  3450.   unsigned EMUSHORT xi[NI];
  3451.   int j, k;
  3452.  
  3453.   emovi (x, xi);
  3454.   k = (int) xi[E] - (EXONE - 1);
  3455.   if (k <= 0)
  3456.     {
  3457.       /* if exponent <= 0, integer = 0 and argument is fraction */
  3458.       *i = 0L;
  3459.       emovo (xi, frac);
  3460.       return;
  3461.     }
  3462.   if (k > HOST_BITS_PER_LONG)
  3463.     {
  3464.       /* Long integer overflow: output large integer
  3465.      and correct fraction.
  3466.      Note, the BSD microvax compiler says that ~(0UL)
  3467.      is a syntax error.  */
  3468.       *i = ~(0L);
  3469.       eshift (xi, k);
  3470.       if (extra_warnings)
  3471.     warning ("overflow on truncation to unsigned integer");
  3472.     }
  3473.   else if (k > 16)
  3474.     {
  3475.       /* Shift more than 16 bits: first shift up k-16 mod 16,
  3476.      then shift up by 16's.  */
  3477.       j = k - ((k >> 4) << 4);
  3478.       eshift (xi, j);
  3479.       ll = xi[M];
  3480.       k -= j;
  3481.       do
  3482.     {
  3483.       eshup6 (xi);
  3484.       ll = (ll << 16) | xi[M];
  3485.     }
  3486.       while ((k -= 16) > 0);
  3487.       *i = ll;
  3488.     }
  3489.   else
  3490.     {
  3491.       /* shift not more than 16 bits */
  3492.       eshift (xi, k);
  3493.       *i = (long) xi[M] & 0xffff;
  3494.     }
  3495.  
  3496.   if (xi[0])  /* A negative value yields unsigned integer 0. */
  3497.     *i = 0L;
  3498.   xi[0] = 0;
  3499.   xi[E] = EXONE - 1;
  3500.   xi[M] = 0;
  3501.   if ((k = enormlz (xi)) > NBITS)
  3502.     ecleaz (xi);
  3503.   else
  3504.     xi[E] -= (unsigned EMUSHORT) k;
  3505.  
  3506.   emovo (xi, frac);
  3507. }
  3508.  
  3509.  
  3510.  
  3511. /*
  3512. ;    Shift significand
  3513. ;
  3514. ;    Shifts significand area up or down by the number of bits
  3515. ;    given by the variable sc.
  3516. */
  3517. int 
  3518. eshift (x, sc)
  3519.      unsigned EMUSHORT *x;
  3520.      int sc;
  3521. {
  3522.   unsigned EMUSHORT lost;
  3523.   unsigned EMUSHORT *p;
  3524.  
  3525.   if (sc == 0)
  3526.     return (0);
  3527.  
  3528.   lost = 0;
  3529.   p = x + NI - 1;
  3530.  
  3531.   if (sc < 0)
  3532.     {
  3533.       sc = -sc;
  3534.       while (sc >= 16)
  3535.     {
  3536.       lost |= *p;        /* remember lost bits */
  3537.       eshdn6 (x);
  3538.       sc -= 16;
  3539.     }
  3540.  
  3541.       while (sc >= 8)
  3542.     {
  3543.       lost |= *p & 0xff;
  3544.       eshdn8 (x);
  3545.       sc -= 8;
  3546.     }
  3547.  
  3548.       while (sc > 0)
  3549.     {
  3550.       lost |= *p & 1;
  3551.       eshdn1 (x);
  3552.       sc -= 1;
  3553.     }
  3554.     }
  3555.   else
  3556.     {
  3557.       while (sc >= 16)
  3558.     {
  3559.       eshup6 (x);
  3560.       sc -= 16;
  3561.     }
  3562.  
  3563.       while (sc >= 8)
  3564.     {
  3565.       eshup8 (x);
  3566.       sc -= 8;
  3567.     }
  3568.  
  3569.       while (sc > 0)
  3570.     {
  3571.       eshup1 (x);
  3572.       sc -= 1;
  3573.     }
  3574.     }
  3575.   if (lost)
  3576.     lost = 1;
  3577.   return ((int) lost);
  3578. }
  3579.  
  3580.  
  3581.  
  3582. /*
  3583. ;    normalize
  3584. ;
  3585. ; Shift normalizes the significand area pointed to by argument
  3586. ; shift count (up = positive) is returned.
  3587. */
  3588. int 
  3589. enormlz (x)
  3590.      unsigned EMUSHORT x[];
  3591. {
  3592.   register unsigned EMUSHORT *p;
  3593.   int sc;
  3594.  
  3595.   sc = 0;
  3596.   p = &x[M];
  3597.   if (*p != 0)
  3598.     goto normdn;
  3599.   ++p;
  3600.   if (*p & 0x8000)
  3601.     return (0);            /* already normalized */
  3602.   while (*p == 0)
  3603.     {
  3604.       eshup6 (x);
  3605.       sc += 16;
  3606.       /* With guard word, there are NBITS+16 bits available.
  3607.        * return true if all are zero.
  3608.        */
  3609.       if (sc > NBITS)
  3610.     return (sc);
  3611.     }
  3612.   /* see if high byte is zero */
  3613.   while ((*p & 0xff00) == 0)
  3614.     {
  3615.       eshup8 (x);
  3616.       sc += 8;
  3617.     }
  3618.   /* now shift 1 bit at a time */
  3619.   while ((*p & 0x8000) == 0)
  3620.     {
  3621.       eshup1 (x);
  3622.       sc += 1;
  3623.       if (sc > NBITS)
  3624.     {
  3625.       mtherr ("enormlz", UNDERFLOW);
  3626.       return (sc);
  3627.     }
  3628.     }
  3629.   return (sc);
  3630.  
  3631.   /* Normalize by shifting down out of the high guard word
  3632.      of the significand */
  3633.  normdn:
  3634.  
  3635.   if (*p & 0xff00)
  3636.     {
  3637.       eshdn8 (x);
  3638.       sc -= 8;
  3639.     }
  3640.   while (*p != 0)
  3641.     {
  3642.       eshdn1 (x);
  3643.       sc -= 1;
  3644.  
  3645.       if (sc < -NBITS)
  3646.     {
  3647.       mtherr ("enormlz", OVERFLOW);
  3648.       return (sc);
  3649.     }
  3650.     }
  3651.   return (sc);
  3652. }
  3653.  
  3654.  
  3655.  
  3656.  
  3657. /* Convert e type number to decimal format ASCII string.
  3658.  * The constants are for 64 bit precision.
  3659.  */
  3660.  
  3661. #define NTEN 12
  3662. #define MAXP 4096
  3663.  
  3664. static unsigned EMUSHORT etens[NTEN + 1][NE] =
  3665. {
  3666.   {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,},    /* 10**4096 */
  3667.   {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,},    /* 10**2048 */
  3668.   {0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
  3669.   {0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
  3670.   {0xddbc, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
  3671.   {0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
  3672.   {0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
  3673.   {0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
  3674.   {0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
  3675.   {0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
  3676.   {0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
  3677.   {0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
  3678.   {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,},    /* 10**1 */
  3679. };
  3680.  
  3681. static unsigned EMUSHORT emtens[NTEN + 1][NE] =
  3682. {
  3683.   {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,},    /* 10**-4096 */
  3684.   {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,},    /* 10**-2048 */
  3685.   {0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
  3686.   {0x7133, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
  3687.   {0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
  3688.   {0xac7d, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
  3689.   {0x3f24, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
  3690.   {0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
  3691.   {0x4c2f, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
  3692.   {0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
  3693.   {0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
  3694.   {0x3d71, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
  3695.   {0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,},    /* 10**-1 */
  3696. };
  3697.  
  3698. void 
  3699. e24toasc (x, string, ndigs)
  3700.      unsigned EMUSHORT x[];
  3701.      char *string;
  3702.      int ndigs;
  3703. {
  3704.   unsigned EMUSHORT w[NI];
  3705.  
  3706.   e24toe (x, w);
  3707.   etoasc (w, string, ndigs);
  3708. }
  3709.  
  3710.  
  3711. void 
  3712. e53toasc (x, string, ndigs)
  3713.      unsigned EMUSHORT x[];
  3714.      char *string;
  3715.      int ndigs;
  3716. {
  3717.   unsigned EMUSHORT w[NI];
  3718.  
  3719.   e53toe (x, w);
  3720.   etoasc (w, string, ndigs);
  3721. }
  3722.  
  3723.  
  3724. void 
  3725. e64toasc (x, string, ndigs)
  3726.      unsigned EMUSHORT x[];
  3727.      char *string;
  3728.      int ndigs;
  3729. {
  3730.   unsigned EMUSHORT w[NI];
  3731.  
  3732.   e64toe (x, w);
  3733.   etoasc (w, string, ndigs);
  3734. }
  3735.  
  3736.  
  3737. static char wstring[80];    /* working storage for ASCII output */
  3738.  
  3739. void 
  3740. etoasc (x, string, ndigs)
  3741.      unsigned EMUSHORT x[];
  3742.      char *string;
  3743.      int ndigs;
  3744. {
  3745.   EMUSHORT digit;
  3746.   unsigned EMUSHORT y[NI], t[NI], u[NI], w[NI];
  3747.   unsigned EMUSHORT *p, *r, *ten;
  3748.   unsigned EMUSHORT sign;
  3749.   int i, j, k, expon, rndsav;
  3750.   char *s, *ss;
  3751.   unsigned EMUSHORT m;
  3752.  
  3753.  
  3754.   rndsav = rndprc;
  3755.   ss = string;
  3756.   s = wstring;
  3757.   *ss = '\0';
  3758.   *s = '\0';
  3759. #ifdef NANS
  3760.   if (eisnan (x))
  3761.     {
  3762.       sprintf (wstring, " NaN ");
  3763.       goto bxit;
  3764.     }
  3765. #endif
  3766.   rndprc = NBITS;        /* set to full precision */
  3767.   emov (x, y);            /* retain external format */
  3768.   if (y[NE - 1] & 0x8000)
  3769.     {
  3770.       sign = 0xffff;
  3771.       y[NE - 1] &= 0x7fff;
  3772.     }
  3773.   else
  3774.     {
  3775.       sign = 0;
  3776.     }
  3777.   expon = 0;
  3778.   ten = &etens[NTEN][0];
  3779.   emov (eone, t);
  3780.   /* Test for zero exponent */
  3781.   if (y[NE - 1] == 0)
  3782.     {
  3783.       for (k = 0; k < NE - 1; k++)
  3784.     {
  3785.       if (y[k] != 0)
  3786.         goto tnzro;        /* denormalized number */
  3787.     }
  3788.       goto isone;        /* legal all zeros */
  3789.     }
  3790.  tnzro:
  3791.  
  3792.   /* Test for infinity. */
  3793.   if (y[NE - 1] == 0x7fff)
  3794.     {
  3795.       if (sign)
  3796.     sprintf (wstring, " -Infinity ");
  3797.       else
  3798.     sprintf (wstring, " Infinity ");
  3799.       goto bxit;
  3800.     }
  3801.  
  3802.   /* Test for exponent nonzero but significand denormalized.
  3803.    * This is an error condition.
  3804.    */
  3805.   if ((y[NE - 1] != 0) && ((y[NE - 2] & 0x8000) == 0))
  3806.     {
  3807.       mtherr ("etoasc", DOMAIN);
  3808.       sprintf (wstring, "NaN");
  3809.       goto bxit;
  3810.     }
  3811.  
  3812.   /* Compare to 1.0 */
  3813.   i = ecmp (eone, y);
  3814.   if (i == 0)
  3815.     goto isone;
  3816.  
  3817.   if (i == -2)
  3818.     abort ();
  3819.  
  3820.   if (i < 0)
  3821.     {                /* Number is greater than 1 */
  3822.       /* Convert significand to an integer and strip trailing decimal zeros. */
  3823.       emov (y, u);
  3824.       u[NE - 1] = EXONE + NBITS - 1;
  3825.  
  3826.       p = &etens[NTEN - 4][0];
  3827.       m = 16;
  3828.       do
  3829.     {
  3830.       ediv (p, u, t);
  3831.       efloor (t, w);
  3832.       for (j = 0; j < NE - 1; j++)
  3833.         {
  3834.           if (t[j] != w[j])
  3835.         goto noint;
  3836.         }
  3837.       emov (t, u);
  3838.       expon += (int) m;
  3839.     noint:
  3840.       p += NE;
  3841.       m >>= 1;
  3842.     }
  3843.       while (m != 0);
  3844.  
  3845.       /* Rescale from integer significand */
  3846.       u[NE - 1] += y[NE - 1] - (unsigned int) (EXONE + NBITS - 1);
  3847.       emov (u, y);
  3848.       /* Find power of 10 */
  3849.       emov (eone, t);
  3850.       m = MAXP;
  3851.       p = &etens[0][0];
  3852.       /* An unordered compare result shouldn't happen here. */
  3853.       while (ecmp (ten, u) <= 0)
  3854.     {
  3855.       if (ecmp (p, u) <= 0)
  3856.         {
  3857.           ediv (p, u, u);
  3858.           emul (p, t, t);
  3859.           expon += (int) m;
  3860.         }
  3861.       m >>= 1;
  3862.       if (m == 0)
  3863.         break;
  3864.       p += NE;
  3865.     }
  3866.     }
  3867.   else
  3868.     {                /* Number is less than 1.0 */
  3869.       /* Pad significand with trailing decimal zeros. */
  3870.       if (y[NE - 1] == 0)
  3871.     {
  3872.       while ((y[NE - 2] & 0x8000) == 0)
  3873.         {
  3874.           emul (ten, y, y);
  3875.           expon -= 1;
  3876.         }
  3877.     }
  3878.       else
  3879.     {
  3880.       emovi (y, w);
  3881.       for (i = 0; i < NDEC + 1; i++)
  3882.         {
  3883.           if ((w[NI - 1] & 0x7) != 0)
  3884.         break;
  3885.           /* multiply by 10 */
  3886.           emovz (w, u);
  3887.           eshdn1 (u);
  3888.           eshdn1 (u);
  3889.           eaddm (w, u);
  3890.           u[1] += 3;
  3891.           while (u[2] != 0)
  3892.         {
  3893.           eshdn1 (u);
  3894.           u[1] += 1;
  3895.         }
  3896.           if (u[NI - 1] != 0)
  3897.         break;
  3898.           if (eone[NE - 1] <= u[1])
  3899.         break;
  3900.           emovz (u, w);
  3901.           expon -= 1;
  3902.         }
  3903.       emovo (w, y);
  3904.     }
  3905.       k = -MAXP;
  3906.       p = &emtens[0][0];
  3907.       r = &etens[0][0];
  3908.       emov (y, w);
  3909.       emov (eone, t);
  3910.       while (ecmp (eone, w) > 0)
  3911.     {
  3912.       if (ecmp (p, w) >= 0)
  3913.         {
  3914.           emul (r, w, w);
  3915.           emul (r, t, t);
  3916.           expon += k;
  3917.         }
  3918.       k /= 2;
  3919.       if (k == 0)
  3920.         break;
  3921.       p += NE;
  3922.       r += NE;
  3923.     }
  3924.       ediv (t, eone, t);
  3925.     }
  3926.  isone:
  3927.   /* Find the first (leading) digit. */
  3928.   emovi (t, w);
  3929.   emovz (w, t);
  3930.   emovi (y, w);
  3931.   emovz (w, y);
  3932.   eiremain (t, y);
  3933.   digit = equot[NI - 1];
  3934.   while ((digit == 0) && (ecmp (y, ezero) != 0))
  3935.     {
  3936.       eshup1 (y);
  3937.       emovz (y, u);
  3938.       eshup1 (u);
  3939.       eshup1 (u);
  3940.       eaddm (u, y);
  3941.       eiremain (t, y);
  3942.       digit = equot[NI - 1];
  3943.       expon -= 1;
  3944.     }
  3945.   s = wstring;
  3946.   if (sign)
  3947.     *s++ = '-';
  3948.   else
  3949.     *s++ = ' ';
  3950.   /* Examine number of digits requested by caller. */
  3951.   if (ndigs < 0)
  3952.     ndigs = 0;
  3953.   if (ndigs > NDEC)
  3954.     ndigs = NDEC;
  3955.   if (digit == 10)
  3956.     {
  3957.       *s++ = '1';
  3958.       *s++ = '.';
  3959.       if (ndigs > 0)
  3960.     {
  3961.       *s++ = '0';
  3962.       ndigs -= 1;
  3963.     }
  3964.       expon += 1;
  3965.     }
  3966.   else
  3967.     {
  3968.       *s++ = (char )digit + '0';
  3969.       *s++ = '.';
  3970.     }
  3971.   /* Generate digits after the decimal point. */
  3972.   for (k = 0; k <= ndigs; k++)
  3973.     {
  3974.       /* multiply current number by 10, without normalizing */
  3975.       eshup1 (y);
  3976.       emovz (y, u);
  3977.       eshup1 (u);
  3978.       eshup1 (u);
  3979.       eaddm (u, y);
  3980.       eiremain (t, y);
  3981.       *s++ = (char) equot[NI - 1] + '0';
  3982.     }
  3983.   digit = equot[NI - 1];
  3984.   --s;
  3985.   ss = s;
  3986.   /* round off the ASCII string */
  3987.   if (digit > 4)
  3988.     {
  3989.       /* Test for critical rounding case in ASCII output. */
  3990.       if (digit == 5)
  3991.     {
  3992.       emovo (y, t);
  3993.       if (ecmp (t, ezero) != 0)
  3994.         goto roun;        /* round to nearest */
  3995.       if ((*(s - 1) & 1) == 0)
  3996.         goto doexp;        /* round to even */
  3997.     }
  3998.       /* Round up and propagate carry-outs */
  3999.     roun:
  4000.       --s;
  4001.       k = *s & 0x7f;
  4002.       /* Carry out to most significant digit? */
  4003.       if (k == '.')
  4004.     {
  4005.       --s;
  4006.       k = *s;
  4007.       k += 1;
  4008.       *s = (char) k;
  4009.       /* Most significant digit carries to 10? */
  4010.       if (k > '9')
  4011.         {
  4012.           expon += 1;
  4013.           *s = '1';
  4014.         }
  4015.       goto doexp;
  4016.     }
  4017.       /* Round up and carry out from less significant digits */
  4018.       k += 1;
  4019.       *s = (char) k;
  4020.       if (k > '9')
  4021.     {
  4022.       *s = '0';
  4023.       goto roun;
  4024.     }
  4025.     }
  4026.  doexp:
  4027.   /*
  4028.      if (expon >= 0)
  4029.      sprintf (ss, "e+%d", expon);
  4030.      else
  4031.      sprintf (ss, "e%d", expon);
  4032.      */
  4033.   sprintf (ss, "e%d", expon);
  4034.  bxit:
  4035.   rndprc = rndsav;
  4036.   /* copy out the working string */
  4037.   s = string;
  4038.   ss = wstring;
  4039.   while (*ss == ' ')        /* strip possible leading space */
  4040.     ++ss;
  4041.   while ((*s++ = *ss++) != '\0')
  4042.     ;
  4043. }
  4044.  
  4045.  
  4046.  
  4047.  
  4048. /*
  4049. ;                                ASCTOQ
  4050. ;        ASCTOQ.MAC        LATEST REV: 11 JAN 84
  4051. ;                    SLM, 3 JAN 78
  4052. ;
  4053. ;    Convert ASCII string to quadruple precision floating point
  4054. ;
  4055. ;        Numeric input is free field decimal number
  4056. ;        with max of 15 digits with or without
  4057. ;        decimal point entered as ASCII from teletype.
  4058. ;    Entering E after the number followed by a second
  4059. ;    number causes the second number to be interpreted
  4060. ;    as a power of 10 to be multiplied by the first number
  4061. ;    (i.e., "scientific" notation).
  4062. ;
  4063. ;    Usage:
  4064. ;        asctoq (string, q);
  4065. */
  4066.  
  4067. /* ASCII to single */
  4068. void 
  4069. asctoe24 (s, y)
  4070.      char *s;
  4071.      unsigned EMUSHORT *y;
  4072. {
  4073.   asctoeg (s, y, 24);
  4074. }
  4075.  
  4076.  
  4077. /* ASCII to double */
  4078. void 
  4079. asctoe53 (s, y)
  4080.      char *s;
  4081.      unsigned EMUSHORT *y;
  4082. {
  4083. #ifdef DEC
  4084.   asctoeg (s, y, 56);
  4085. #else
  4086.   asctoeg (s, y, 53);
  4087. #endif
  4088. }
  4089.  
  4090.  
  4091. /* ASCII to long double */
  4092. void 
  4093. asctoe64 (s, y)
  4094.      char *s;
  4095.      unsigned EMUSHORT *y;
  4096. {
  4097.   asctoeg (s, y, 64);
  4098. }
  4099.  
  4100. /* ASCII to super double */
  4101. void 
  4102. asctoe (s, y)
  4103.      char *s;
  4104.      unsigned EMUSHORT *y;
  4105. {
  4106.   asctoeg (s, y, NBITS);
  4107. }
  4108.  
  4109. /* Space to make a copy of the input string: */
  4110. static char lstr[82];
  4111.  
  4112. void 
  4113. asctoeg (ss, y, oprec)
  4114.      char *ss;
  4115.      unsigned EMUSHORT *y;
  4116.      int oprec;
  4117. {
  4118.   unsigned EMUSHORT yy[NI], xt[NI], tt[NI];
  4119.   int esign, decflg, sgnflg, nexp, exp, prec, lost;
  4120.   int k, trail, c, rndsav;
  4121.   EMULONG lexp;
  4122.   unsigned EMUSHORT nsign, *p;
  4123.   char *sp, *s;
  4124.  
  4125.   /* Copy the input string. */
  4126.   s = ss;
  4127.   while (*s == ' ')        /* skip leading spaces */
  4128.     ++s;
  4129.   sp = lstr;
  4130.   for (k = 0; k < 79; k++)
  4131.     {
  4132.       if ((*sp++ = *s++) == '\0')
  4133.     break;
  4134.     }
  4135.   *sp = '\0';
  4136.   s = lstr;
  4137.  
  4138.   rndsav = rndprc;
  4139.   rndprc = NBITS;        /* Set to full precision */
  4140.   lost = 0;
  4141.   nsign = 0;
  4142.   decflg = 0;
  4143.   sgnflg = 0;
  4144.   nexp = 0;
  4145.   exp = 0;
  4146.   prec = 0;
  4147.   ecleaz (yy);
  4148.   trail = 0;
  4149.  
  4150.  nxtcom:
  4151.   k = *s - '0';
  4152.   if ((k >= 0) && (k <= 9))
  4153.     {
  4154.       /* Ignore leading zeros */
  4155.       if ((prec == 0) && (decflg == 0) && (k == 0))
  4156.     goto donchr;
  4157.       /* Identify and strip trailing zeros after the decimal point. */
  4158.       if ((trail == 0) && (decflg != 0))
  4159.     {
  4160.       sp = s;
  4161.       while ((*sp >= '0') && (*sp <= '9'))
  4162.         ++sp;
  4163.       /* Check for syntax error */
  4164.       c = *sp & 0x7f;
  4165.       if ((c != 'e') && (c != 'E') && (c != '\0')
  4166.           && (c != '\n') && (c != '\r') && (c != ' ')
  4167.           && (c != ','))
  4168.         goto error;
  4169.       --sp;
  4170.       while (*sp == '0')
  4171.         *sp-- = 'z';
  4172.       trail = 1;
  4173.       if (*s == 'z')
  4174.         goto donchr;
  4175.     }
  4176.       /* If enough digits were given to more than fill up the yy register,
  4177.        * continuing until overflow into the high guard word yy[2]
  4178.        * guarantees that there will be a roundoff bit at the top
  4179.        * of the low guard word after normalization.
  4180.        */
  4181.       if (yy[2] == 0)
  4182.     {
  4183.       if (decflg)
  4184.         nexp += 1;        /* count digits after decimal point */
  4185.       eshup1 (yy);        /* multiply current number by 10 */
  4186.       emovz (yy, xt);
  4187.       eshup1 (xt);
  4188.       eshup1 (xt);
  4189.       eaddm (xt, yy);
  4190.       ecleaz (xt);
  4191.       xt[NI - 2] = (unsigned EMUSHORT) k;
  4192.       eaddm (xt, yy);
  4193.     }
  4194.       else
  4195.     {
  4196.       lost |= k;
  4197.     }
  4198.       prec += 1;
  4199.       goto donchr;
  4200.     }
  4201.  
  4202.   switch (*s)
  4203.     {
  4204.     case 'z':
  4205.       break;
  4206.     case 'E':
  4207.     case 'e':
  4208.       goto expnt;
  4209.     case '.':            /* decimal point */
  4210.       if (decflg)
  4211.     goto error;
  4212.       ++decflg;
  4213.       break;
  4214.     case '-':
  4215.       nsign = 0xffff;
  4216.       if (sgnflg)
  4217.     goto error;
  4218.       ++sgnflg;
  4219.       break;
  4220.     case '+':
  4221.       if (sgnflg)
  4222.     goto error;
  4223.       ++sgnflg;
  4224.       break;
  4225.     case ',':
  4226.     case ' ':
  4227.     case '\0':
  4228.     case '\n':
  4229.     case '\r':
  4230.       goto daldone;
  4231.     case 'i':
  4232.     case 'I':
  4233.       goto infinite;
  4234.     default:
  4235.     error:
  4236. #ifdef NANS
  4237.       einan (yy);
  4238. #else
  4239.       mtherr ("asctoe", DOMAIN);
  4240.       eclear (yy);
  4241. #endif
  4242.       goto aexit;
  4243.     }
  4244.  donchr:
  4245.   ++s;
  4246.   goto nxtcom;
  4247.  
  4248.   /* Exponent interpretation */
  4249.  expnt:
  4250.  
  4251.   esign = 1;
  4252.   exp = 0;
  4253.   ++s;
  4254.   /* check for + or - */
  4255.   if (*s == '-')
  4256.     {
  4257.       esign = -1;
  4258.       ++s;
  4259.     }
  4260.   if (*s == '+')
  4261.     ++s;
  4262.   while ((*s >= '0') && (*s <= '9'))
  4263.     {
  4264.       exp *= 10;
  4265.       exp += *s++ - '0';
  4266.       if (exp > 4956)
  4267.     {
  4268.       if (esign < 0)
  4269.         goto zero;
  4270.       else
  4271.         goto infinite;
  4272.     }
  4273.     }
  4274.   if (esign < 0)
  4275.     exp = -exp;
  4276.   if (exp > 4932)
  4277.     {
  4278.  infinite:
  4279.       ecleaz (yy);
  4280.       yy[E] = 0x7fff;        /* infinity */
  4281.       goto aexit;
  4282.     }
  4283.   if (exp < -4956)
  4284.     {
  4285.  zero:
  4286.       ecleaz (yy);
  4287.       goto aexit;
  4288.     }
  4289.  
  4290.  daldone:
  4291.   nexp = exp - nexp;
  4292.   /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
  4293.   while ((nexp > 0) && (yy[2] == 0))
  4294.     {
  4295.       emovz (yy, xt);
  4296.       eshup1 (xt);
  4297.       eshup1 (xt);
  4298.       eaddm (yy, xt);
  4299.       eshup1 (xt);
  4300.       if (xt[2] != 0)
  4301.     break;
  4302.       nexp -= 1;
  4303.       emovz (xt, yy);
  4304.     }
  4305.   if ((k = enormlz (yy)) > NBITS)
  4306.     {
  4307.       ecleaz (yy);
  4308.       goto aexit;
  4309.     }
  4310.   lexp = (EXONE - 1 + NBITS) - k;
  4311.   emdnorm (yy, lost, 0, lexp, 64);
  4312.   /* convert to external format */
  4313.  
  4314.  
  4315.   /* Multiply by 10**nexp.  If precision is 64 bits,
  4316.    * the maximum relative error incurred in forming 10**n
  4317.    * for 0 <= n <= 324 is 8.2e-20, at 10**180.
  4318.    * For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
  4319.    * For 0 >= n >= -999, it is -1.55e-19 at 10**-435.
  4320.    */
  4321.   lexp = yy[E];
  4322.   if (nexp == 0)
  4323.     {
  4324.       k = 0;
  4325.       goto expdon;
  4326.     }
  4327.   esign = 1;
  4328.   if (nexp < 0)
  4329.     {
  4330.       nexp = -nexp;
  4331.       esign = -1;
  4332.       if (nexp > 4096)
  4333.     {            /* Punt.  Can't handle this without 2 divides. */
  4334.       emovi (etens[0], tt);
  4335.       lexp -= tt[E];
  4336.       k = edivm (tt, yy);
  4337.       lexp += EXONE;
  4338.       nexp -= 4096;
  4339.     }
  4340.     }
  4341.   p = &etens[NTEN][0];
  4342.   emov (eone, xt);
  4343.   exp = 1;
  4344.   do
  4345.     {
  4346.       if (exp & nexp)
  4347.     emul (p, xt, xt);
  4348.       p -= NE;
  4349.       exp = exp + exp;
  4350.     }
  4351.   while (exp <= MAXP);
  4352.  
  4353.   emovi (xt, tt);
  4354.   if (esign < 0)
  4355.     {
  4356.       lexp -= tt[E];
  4357.       k = edivm (tt, yy);
  4358.       lexp += EXONE;
  4359.     }
  4360.   else
  4361.     {
  4362.       lexp += tt[E];
  4363.       k = emulm (tt, yy);
  4364.       lexp -= EXONE - 1;
  4365.     }
  4366.  
  4367.  expdon:
  4368.  
  4369.   /* Round and convert directly to the destination type */
  4370.   if (oprec == 53)
  4371.     lexp -= EXONE - 0x3ff;
  4372.   else if (oprec == 24)
  4373.     lexp -= EXONE - 0177;
  4374. #ifdef DEC
  4375.   else if (oprec == 56)
  4376.     lexp -= EXONE - 0201;
  4377. #endif
  4378.   rndprc = oprec;
  4379.   emdnorm (yy, k, 0, lexp, 64);
  4380.  
  4381.  aexit:
  4382.  
  4383.   rndprc = rndsav;
  4384.   yy[0] = nsign;
  4385.   switch (oprec)
  4386.     {
  4387. #ifdef DEC
  4388.     case 56:
  4389.       todec (yy, y);        /* see etodec.c */
  4390.       break;
  4391. #endif
  4392.     case 53:
  4393.       toe53 (yy, y);
  4394.       break;
  4395.     case 24:
  4396.       toe24 (yy, y);
  4397.       break;
  4398.     case 64:
  4399.       toe64 (yy, y);
  4400.       break;
  4401.     case NBITS:
  4402.       emovo (yy, y);
  4403.       break;
  4404.     }
  4405. }
  4406.  
  4407.  
  4408.  
  4409. /* y = largest integer not greater than x
  4410.  * (truncated toward minus infinity)
  4411.  *
  4412.  * unsigned EMUSHORT x[NE], y[NE]
  4413.  *
  4414.  * efloor (x, y);
  4415.  */
  4416. static unsigned EMUSHORT bmask[] =
  4417. {
  4418.   0xffff,
  4419.   0xfffe,
  4420.   0xfffc,
  4421.   0xfff8,
  4422.   0xfff0,
  4423.   0xffe0,
  4424.   0xffc0,
  4425.   0xff80,
  4426.   0xff00,
  4427.   0xfe00,
  4428.   0xfc00,
  4429.   0xf800,
  4430.   0xf000,
  4431.   0xe000,
  4432.   0xc000,
  4433.   0x8000,
  4434.   0x0000,
  4435. };
  4436.  
  4437. void 
  4438. efloor (x, y)
  4439.      unsigned EMUSHORT x[], y[];
  4440. {
  4441.   register unsigned EMUSHORT *p;
  4442.   int e, expon, i;
  4443.   unsigned EMUSHORT f[NE];
  4444.  
  4445.   emov (x, f);            /* leave in external format */
  4446.   expon = (int) f[NE - 1];
  4447.   e = (expon & 0x7fff) - (EXONE - 1);
  4448.   if (e <= 0)
  4449.     {
  4450.       eclear (y);
  4451.       goto isitneg;
  4452.     }
  4453.   /* number of bits to clear out */
  4454.   e = NBITS - e;
  4455.   emov (f, y);
  4456.   if (e <= 0)
  4457.     return;
  4458.  
  4459.   p = &y[0];
  4460.   while (e >= 16)
  4461.     {
  4462.       *p++ = 0;
  4463.       e -= 16;
  4464.     }
  4465.   /* clear the remaining bits */
  4466.   *p &= bmask[e];
  4467.   /* truncate negatives toward minus infinity */
  4468.  isitneg:
  4469.  
  4470.   if ((unsigned EMUSHORT) expon & (unsigned EMUSHORT) 0x8000)
  4471.     {
  4472.       for (i = 0; i < NE - 1; i++)
  4473.     {
  4474.       if (f[i] != y[i])
  4475.         {
  4476.           esub (eone, y, y);
  4477.           break;
  4478.         }
  4479.     }
  4480.     }
  4481. }
  4482.  
  4483.  
  4484. /* unsigned EMUSHORT x[], s[];
  4485.  * int *exp;
  4486.  *
  4487.  * efrexp (x, exp, s);
  4488.  *
  4489.  * Returns s and exp such that  s * 2**exp = x and .5 <= s < 1.
  4490.  * For example, 1.1 = 0.55 * 2**1
  4491.  * Handles denormalized numbers properly using long integer exp.
  4492.  */
  4493. void 
  4494. efrexp (x, exp, s)
  4495.      unsigned EMUSHORT x[];
  4496.      int *exp;
  4497.      unsigned EMUSHORT s[];
  4498. {
  4499.   unsigned EMUSHORT xi[NI];
  4500.   EMULONG li;
  4501.  
  4502.   emovi (x, xi);
  4503.   li = (EMULONG) ((EMUSHORT) xi[1]);
  4504.  
  4505.   if (li == 0)
  4506.     {
  4507.       li -= enormlz (xi);
  4508.     }
  4509.   xi[1] = 0x3ffe;
  4510.   emovo (xi, s);
  4511.   *exp = (int) (li - 0x3ffe);
  4512. }
  4513.  
  4514.  
  4515.  
  4516. /* unsigned EMUSHORT x[], y[];
  4517.  * long pwr2;
  4518.  *
  4519.  * eldexp (x, pwr2, y);
  4520.  *
  4521.  * Returns y = x * 2**pwr2.
  4522.  */
  4523. void 
  4524. eldexp (x, pwr2, y)
  4525.      unsigned EMUSHORT x[];
  4526.      int pwr2;
  4527.      unsigned EMUSHORT y[];
  4528. {
  4529.   unsigned EMUSHORT xi[NI];
  4530.   EMULONG li;
  4531.   int i;
  4532.  
  4533.   emovi (x, xi);
  4534.   li = xi[1];
  4535.   li += pwr2;
  4536.   i = 0;
  4537.   emdnorm (xi, i, i, li, 64);
  4538.   emovo (xi, y);
  4539. }
  4540.  
  4541.  
  4542. /* c = remainder after dividing b by a
  4543.  * Least significant integer quotient bits left in equot[].
  4544.  */
  4545. void 
  4546. eremain (a, b, c)
  4547.      unsigned EMUSHORT a[], b[], c[];
  4548. {
  4549.   unsigned EMUSHORT den[NI], num[NI];
  4550.  
  4551. #ifdef NANS
  4552.   if ( eisinf (b)
  4553.        || (ecmp (a, ezero) == 0)
  4554.        || eisnan (a)
  4555.        || eisnan (b))
  4556.     {
  4557.       enan (c);
  4558.       return;
  4559.     }
  4560. #endif
  4561.   if (ecmp (a, ezero) == 0)
  4562.     {
  4563.       mtherr ("eremain", SING);
  4564.       eclear (c);
  4565.       return;
  4566.     }
  4567.   emovi (a, den);
  4568.   emovi (b, num);
  4569.   eiremain (den, num);
  4570.   /* Sign of remainder = sign of quotient */
  4571.   if (a[0] == b[0])
  4572.     num[0] = 0;
  4573.   else
  4574.     num[0] = 0xffff;
  4575.   emovo (num, c);
  4576. }
  4577.  
  4578. void 
  4579. eiremain (den, num)
  4580.      unsigned EMUSHORT den[], num[];
  4581. {
  4582.   EMULONG ld, ln;
  4583.   unsigned EMUSHORT j;
  4584.  
  4585.   ld = den[E];
  4586.   ld -= enormlz (den);
  4587.   ln = num[E];
  4588.   ln -= enormlz (num);
  4589.   ecleaz (equot);
  4590.   while (ln >= ld)
  4591.     {
  4592.       if (ecmpm (den, num) <= 0)
  4593.     {
  4594.       esubm (den, num);
  4595.       j = 1;
  4596.     }
  4597.       else
  4598.     {
  4599.       j = 0;
  4600.     }
  4601.       eshup1 (equot);
  4602.       equot[NI - 1] |= j;
  4603.       eshup1 (num);
  4604.       ln -= 1;
  4605.     }
  4606.   emdnorm (num, 0, 0, ln, 0);
  4607. }
  4608.  
  4609. /*                            mtherr.c
  4610.  *
  4611.  *    Library common error handling routine
  4612.  *
  4613.  *
  4614.  *
  4615.  * SYNOPSIS:
  4616.  *
  4617.  * char *fctnam;
  4618.  * int code;
  4619.  * void mtherr ();
  4620.  *
  4621.  * mtherr (fctnam, code);
  4622.  *
  4623.  *
  4624.  *
  4625.  * DESCRIPTION:
  4626.  *
  4627.  * This routine may be called to report one of the following
  4628.  * error conditions (in the include file mconf.h).
  4629.  *
  4630.  *   Mnemonic        Value          Significance
  4631.  *
  4632.  *    DOMAIN            1       argument domain error
  4633.  *    SING              2       function singularity
  4634.  *    OVERFLOW          3       overflow range error
  4635.  *    UNDERFLOW         4       underflow range error
  4636.  *    TLOSS             5       total loss of precision
  4637.  *    PLOSS             6       partial loss of precision
  4638.  *    INVALID           7       NaN - producing operation
  4639.  *    EDOM             33       Unix domain error code
  4640.  *    ERANGE           34       Unix range error code
  4641.  *
  4642.  * The default version of the file prints the function name,
  4643.  * passed to it by the pointer fctnam, followed by the
  4644.  * error condition.  The display is directed to the standard
  4645.  * output device.  The routine then returns to the calling
  4646.  * program.  Users may wish to modify the program to abort by
  4647.  * calling exit under severe error conditions such as domain
  4648.  * errors.
  4649.  *
  4650.  * Since all error conditions pass control to this function,
  4651.  * the display may be easily changed, eliminated, or directed
  4652.  * to an error logging device.
  4653.  *
  4654.  * SEE ALSO:
  4655.  *
  4656.  * mconf.h
  4657.  *
  4658.  */
  4659.  
  4660. /*
  4661. Cephes Math Library Release 2.0:  April, 1987
  4662. Copyright 1984, 1987 by Stephen L. Moshier
  4663. Direct inquiries to 30 Frost Street, Cambridge, MA 02140
  4664. */
  4665.  
  4666. /* include "mconf.h" */
  4667.  
  4668. /* Notice: the order of appearance of the following
  4669.  * messages is bound to the error codes defined
  4670.  * in mconf.h.
  4671.  */
  4672. #define NMSGS 8
  4673. static char *ermsg[NMSGS] =
  4674. {
  4675.   "unknown",            /* error code 0 */
  4676.   "domain",            /* error code 1 */
  4677.   "singularity",        /* et seq.      */
  4678.   "overflow",
  4679.   "underflow",
  4680.   "total loss of precision",
  4681.   "partial loss of precision",
  4682.   "invalid operation"
  4683. };
  4684.  
  4685. int merror = 0;
  4686. extern int merror;
  4687.  
  4688. void 
  4689. mtherr (name, code)
  4690.      char *name;
  4691.      int code;
  4692. {
  4693.   char errstr[80];
  4694.  
  4695.   /* Display string passed by calling program,
  4696.    * which is supposed to be the name of the
  4697.    * function in which the error occurred.
  4698.    */
  4699.  
  4700.   /* Display error message defined
  4701.    * by the code argument.
  4702.    */
  4703.   if ((code <= 0) || (code >= NMSGS))
  4704.     code = 0;
  4705.   sprintf (errstr, " %s %s error", name, ermsg[code]);
  4706.   if (extra_warnings)
  4707.     warning (errstr);
  4708.   /* Set global error message word */
  4709.   merror = code + 1;
  4710.  
  4711.   /* Return to calling
  4712.    * program
  4713.    */
  4714. }
  4715.  
  4716. /* Here is etodec.c .
  4717.  *
  4718.  */
  4719.  
  4720. /*
  4721. ;    convert DEC double precision to e type
  4722. ;    double d;
  4723. ;    EMUSHORT e[NE];
  4724. ;    dectoe (&d, e);
  4725. */
  4726. void 
  4727. dectoe (d, e)
  4728.      unsigned EMUSHORT *d;
  4729.      unsigned EMUSHORT *e;
  4730. {
  4731.   unsigned EMUSHORT y[NI];
  4732.   register unsigned EMUSHORT r, *p;
  4733.  
  4734.   ecleaz (y);            /* start with a zero */
  4735.   p = y;            /* point to our number */
  4736.   r = *d;            /* get DEC exponent word */
  4737.   if (*d & (unsigned int) 0x8000)
  4738.     *p = 0xffff;        /* fill in our sign */
  4739.   ++p;                /* bump pointer to our exponent word */
  4740.   r &= 0x7fff;            /* strip the sign bit */
  4741.   if (r == 0)            /* answer = 0 if high order DEC word = 0 */
  4742.     goto done;
  4743.  
  4744.  
  4745.   r >>= 7;            /* shift exponent word down 7 bits */
  4746.   r += EXONE - 0201;        /* subtract DEC exponent offset */
  4747.   /* add our e type exponent offset */
  4748.   *p++ = r;            /* to form our exponent */
  4749.  
  4750.   r = *d++;            /* now do the high order mantissa */
  4751.   r &= 0177;            /* strip off the DEC exponent and sign bits */
  4752.   r |= 0200;            /* the DEC understood high order mantissa bit */
  4753.   *p++ = r;            /* put result in our high guard word */
  4754.  
  4755.   *p++ = *d++;            /* fill in the rest of our mantissa */
  4756.   *p++ = *d++;
  4757.   *p = *d;
  4758.  
  4759.   eshdn8 (y);            /* shift our mantissa down 8 bits */
  4760.  done:
  4761.   emovo (y, e);
  4762. }
  4763.  
  4764.  
  4765.  
  4766. /*
  4767. ;    convert e type to DEC double precision
  4768. ;    double d;
  4769. ;    EMUSHORT e[NE];
  4770. ;    etodec (e, &d);
  4771. */
  4772. #if 0
  4773. static unsigned EMUSHORT decbit[NI] = {0, 0, 0, 0, 0, 0, 0200, 0};
  4774.  
  4775. void 
  4776. etodec (x, d)
  4777.      unsigned EMUSHORT *x, *d;
  4778. {
  4779.   unsigned EMUSHORT xi[NI];
  4780.   register unsigned EMUSHORT r;
  4781.   int i, j;
  4782.  
  4783.   emovi (x, xi);
  4784.   *d = 0;
  4785.   if (xi[0] != 0)
  4786.     *d = 0100000;
  4787.   r = xi[E];
  4788.   if (r < (EXONE - 128))
  4789.     goto zout;
  4790.   i = xi[M + 4];
  4791.   if ((i & 0200) != 0)
  4792.     {
  4793.       if ((i & 0377) == 0200)
  4794.     {
  4795.       if ((i & 0400) != 0)
  4796.         {
  4797.           /* check all less significant bits */
  4798.           for (j = M + 5; j < NI; j++)
  4799.         {
  4800.           if (xi[j] != 0)
  4801.             goto yesrnd;
  4802.         }
  4803.         }
  4804.       goto nornd;
  4805.     }
  4806.     yesrnd:
  4807.       eaddm (decbit, xi);
  4808.       r -= enormlz (xi);
  4809.     }
  4810.  
  4811.  nornd:
  4812.  
  4813.   r -= EXONE;
  4814.   r += 0201;
  4815.   if (r < 0)
  4816.     {
  4817.     zout:
  4818.       *d++ = 0;
  4819.       *d++ = 0;
  4820.       *d++ = 0;
  4821.       *d++ = 0;
  4822.       return;
  4823.     }
  4824.   if (r >= 0377)
  4825.     {
  4826.       *d++ = 077777;
  4827.       *d++ = -1;
  4828.       *d++ = -1;
  4829.       *d++ = -1;
  4830.       return;
  4831.     }
  4832.   r &= 0377;
  4833.   r <<= 7;
  4834.   eshup8 (xi);
  4835.   xi[M] &= 0177;
  4836.   r |= xi[M];
  4837.   *d++ |= r;
  4838.   *d++ = xi[M + 1];
  4839.   *d++ = xi[M + 2];
  4840.   *d++ = xi[M + 3];
  4841. }
  4842.  
  4843. #else
  4844.  
  4845. void 
  4846. etodec (x, d)
  4847.      unsigned EMUSHORT *x, *d;
  4848. {
  4849.   unsigned EMUSHORT xi[NI];
  4850.   EMULONG exp;
  4851.   int rndsav;
  4852.  
  4853.   emovi (x, xi);
  4854.   exp = (EMULONG) xi[E] - (EXONE - 0201);    /* adjust exponent for offsets */
  4855. /* round off to nearest or even */
  4856.   rndsav = rndprc;
  4857.   rndprc = 56;
  4858.   emdnorm (xi, 0, 0, exp, 64);
  4859.   rndprc = rndsav;
  4860.   todec (xi, d);
  4861. }
  4862.  
  4863. void 
  4864. todec (x, y)
  4865.      unsigned EMUSHORT *x, *y;
  4866. {
  4867.   unsigned EMUSHORT i;
  4868.   unsigned EMUSHORT *p;
  4869.  
  4870.   p = x;
  4871.   *y = 0;
  4872.   if (*p++)
  4873.     *y = 0100000;
  4874.   i = *p++;
  4875.   if (i == 0)
  4876.     {
  4877.       *y++ = 0;
  4878.       *y++ = 0;
  4879.       *y++ = 0;
  4880.       *y++ = 0;
  4881.       return;
  4882.     }
  4883.   if (i > 0377)
  4884.     {
  4885.       *y++ |= 077777;
  4886.       *y++ = 0xffff;
  4887.       *y++ = 0xffff;
  4888.       *y++ = 0xffff;
  4889. #ifdef ERANGE
  4890.       errno = ERANGE;
  4891. #endif
  4892.       return;
  4893.     }
  4894.   i &= 0377;
  4895.   i <<= 7;
  4896.   eshup8 (x);
  4897.   x[M] &= 0177;
  4898.   i |= x[M];
  4899.   *y++ |= i;
  4900.   *y++ = x[M + 1];
  4901.   *y++ = x[M + 2];
  4902.   *y++ = x[M + 3];
  4903. }
  4904.  
  4905. #endif /* not 0 */
  4906.  
  4907.  
  4908. /* Output a binary NaN bit pattern in the target machine's format.  */
  4909.  
  4910. /* If special NaN bit patterns are required, define them in tm.h
  4911.    as arrays of unsigned 16-bit shorts.  Otherwise, use the default
  4912.    patterns here. */
  4913. #ifdef TFMODE_NAN
  4914. TFMODE_NAN;
  4915. #else
  4916. #ifdef MIEEE
  4917. unsigned EMUSHORT TFnan[8] =
  4918.  {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
  4919. #endif
  4920. #ifdef IBMPC
  4921. unsigned EMUSHORT TFnan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
  4922. #endif
  4923. #endif
  4924.  
  4925. #ifdef XFMODE_NAN
  4926. XFMODE_NAN;
  4927. #else
  4928. #ifdef MIEEE
  4929. unsigned EMUSHORT XFnan[6] = {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
  4930. #endif
  4931. #ifdef IBMPC
  4932. unsigned EMUSHORT XFnan[6] = {0, 0, 0, 0xc000, 0xffff, 0};
  4933. #endif
  4934. #endif
  4935.  
  4936. #ifdef DFMODE_NAN
  4937. DFMODE_NAN;
  4938. #else
  4939. #ifdef MIEEE
  4940. unsigned EMUSHORT DFnan[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
  4941. #endif
  4942. #ifdef IBMPC
  4943. unsigned EMUSHORT DFnan[4] = {0, 0, 0, 0xfff8};
  4944. #endif
  4945. #endif
  4946.  
  4947. #ifdef SFMODE_NAN
  4948. SFMODE_NAN;
  4949. #else
  4950. #ifdef MIEEE
  4951. unsigned EMUSHORT SFnan[2] = {0x7fff, 0xffff};
  4952. #endif
  4953. #ifdef IBMPC
  4954. unsigned EMUSHORT SFnan[2] = {0, 0xffc0};
  4955. #endif
  4956. #endif
  4957.  
  4958.  
  4959. void
  4960. make_nan (nan, mode)
  4961. unsigned EMUSHORT *nan;
  4962. enum machine_mode mode;
  4963. {
  4964.   int i, n;
  4965.   unsigned EMUSHORT *p;
  4966.  
  4967.   switch (mode)
  4968.     {
  4969. /* Possibly the `reserved operand' patterns on a VAX can be
  4970.    used like NaN's, but probably not in the same way as IEEE. */
  4971. #ifndef DEC
  4972.     case TFmode:
  4973.       n = 8;
  4974.       p = TFnan;
  4975.       break;
  4976.     case XFmode:
  4977.       n = 6;
  4978.       p = XFnan;
  4979.       break;
  4980.     case DFmode:
  4981.       n = 4;
  4982.       p = DFnan;
  4983.       break;
  4984.     case SFmode:
  4985.       n = 2;
  4986.       p = SFnan;
  4987.       break;
  4988. #endif
  4989.     default:
  4990.       abort ();
  4991.     }
  4992.   for (i=0; i < n; i++)
  4993.     *nan++ = *p++;
  4994. }
  4995.  
  4996. /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
  4997.    This is the inverse of the function `etarsingle' invoked by
  4998.    REAL_VALUE_TO_TARGET_SINGLE.  */
  4999.  
  5000. REAL_VALUE_TYPE
  5001. ereal_from_float (f)
  5002.      unsigned long f;
  5003. {
  5004.   REAL_VALUE_TYPE r;
  5005.   unsigned EMUSHORT s[2];
  5006.   unsigned EMUSHORT e[NE];
  5007.  
  5008.   /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
  5009.    This is the inverse operation to what the function `endian' does.  */
  5010. #if WORDS_BIG_ENDIAN
  5011.   s[0] = (unsigned EMUSHORT) (f >> 16);
  5012.   s[1] = (unsigned EMUSHORT) f;
  5013. #else
  5014.   s[0] = (unsigned EMUSHORT) f;
  5015.   s[1] = (unsigned EMUSHORT) (f >> 16);
  5016. #endif
  5017.   /* Convert and promote the target float to E-type. */
  5018.   e24toe (s, e);
  5019.   /* Output E-type to REAL_VALUE_TYPE. */
  5020.   PUT_REAL (e, &r);
  5021.   return r;
  5022. }
  5023.  
  5024. /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
  5025.    This is the inverse of the function `etardouble' invoked by
  5026.    REAL_VALUE_TO_TARGET_DOUBLE.
  5027.  
  5028.    The DFmode is stored as an array of longs (i.e., HOST_WIDE_INTs)
  5029.    with 32 bits of the value per each long.  The first element
  5030.    of the input array holds the bits that would come first in the
  5031.    target computer's memory.  */
  5032.  
  5033. REAL_VALUE_TYPE
  5034. ereal_from_double (d)
  5035.      unsigned long d[];
  5036. {
  5037.   REAL_VALUE_TYPE r;
  5038.   unsigned EMUSHORT s[4];
  5039.   unsigned EMUSHORT e[NE];
  5040.  
  5041.   /* Convert array of 32 bit pieces to equivalent array of 16 bit pieces.
  5042.      This is the inverse of `endian'.   */
  5043. #if WORDS_BIG_ENDIAN
  5044.   s[0] = (unsigned EMUSHORT) (d[0] >> 16);
  5045.   s[1] = (unsigned EMUSHORT) d[0];
  5046.   s[2] = (unsigned EMUSHORT) (d[1] >> 16);
  5047.   s[3] = (unsigned EMUSHORT) d[1];
  5048. #else
  5049.   s[0] = (unsigned EMUSHORT) d[0];
  5050.   s[1] = (unsigned EMUSHORT) (d[0] >> 16);
  5051.   s[2] = (unsigned EMUSHORT) d[1];
  5052.   s[3] = (unsigned EMUSHORT) (d[1] >> 16);
  5053. #endif
  5054.   /* Convert target double to E-type. */
  5055.   e53toe (s, e);
  5056.   /* Output E-type to REAL_VALUE_TYPE. */
  5057.   PUT_REAL (e, &r);
  5058.   return r;
  5059. }
  5060. #endif /* EMU_NON_COMPILE not defined */
  5061.