+++ /dev/null
-/* $NetBSD: misc.c,v 1.3.12.1 2008/04/08 21:10:55 jdc Exp $ */\r
-\r
-/****************************************************************\r
-\r
-The author of this software is David M. Gay.\r
-\r
-Copyright (C) 1998, 1999 by Lucent Technologies\r
-All Rights Reserved\r
-\r
-Permission to use, copy, modify, and distribute this software and\r
-its documentation for any purpose and without fee is hereby\r
-granted, provided that the above copyright notice appear in all\r
-copies and that both that the copyright notice and this\r
-permission notice and warranty disclaimer appear in supporting\r
-documentation, and that the name of Lucent or any of its entities\r
-not be used in advertising or publicity pertaining to\r
-distribution of the software without specific, written prior\r
-permission.\r
-\r
-LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\r
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.\r
-IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY\r
-SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER\r
-IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\r
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\r
-THIS SOFTWARE.\r
-\r
-****************************************************************/\r
-\r
-/* Please send bug reports to David M. Gay (dmg at acm dot org,\r
- * with " at " changed at "@" and " dot " changed to "."). */\r
-#include <LibConfig.h>\r
-\r
-#include "gdtoaimp.h"\r
-\r
-#if defined(_MSC_VER)\r
- // Disable warnings about assignment within conditional expressions.\r
- #pragma warning ( disable : 4706 )\r
-#endif\r
-\r
-static Bigint *freelist[Kmax+1];\r
-#ifndef Omit_Private_Memory\r
-#ifndef PRIVATE_MEM\r
-#define PRIVATE_MEM 2304\r
-#endif\r
-#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))\r
-static double private_mem[PRIVATE_mem], *pmem_next = private_mem;\r
-#endif\r
-\r
- Bigint *\r
-Balloc\r
-#ifdef KR_headers\r
- (k) int k;\r
-#else\r
- (int k)\r
-#endif\r
-{\r
- int x;\r
- Bigint *rv;\r
-#ifndef Omit_Private_Memory\r
- unsigned int len;\r
-#endif\r
-\r
- ACQUIRE_DTOA_LOCK(0);\r
- if ( (rv = freelist[k]) !=0) {\r
- freelist[k] = rv->next;\r
- }\r
- else {\r
- x = 1 << k;\r
-#ifdef Omit_Private_Memory\r
- rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));\r
-#else\r
- len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)\r
- /sizeof(double);\r
- if (pmem_next - private_mem + len <= PRIVATE_mem) {\r
- rv = (Bigint*)(void *)pmem_next;\r
- pmem_next += len;\r
- }\r
- else\r
- rv = (Bigint*)MALLOC(len*sizeof(double));\r
-#endif\r
- if (rv == NULL)\r
- return NULL;\r
- rv->k = k;\r
- rv->maxwds = x;\r
- }\r
- FREE_DTOA_LOCK(0);\r
- rv->sign = rv->wds = 0;\r
- return rv;\r
- }\r
-\r
- void\r
-Bfree\r
-#ifdef KR_headers\r
- (v) Bigint *v;\r
-#else\r
- (Bigint *v)\r
-#endif\r
-{\r
- if (v) {\r
- ACQUIRE_DTOA_LOCK(0);\r
- v->next = freelist[v->k];\r
- freelist[v->k] = v;\r
- FREE_DTOA_LOCK(0);\r
- }\r
- }\r
-\r
- int\r
-lo0bits\r
-#ifdef KR_headers\r
- (y) ULong *y;\r
-#else\r
- (ULong *y)\r
-#endif\r
-{\r
- int k;\r
- ULong x = *y;\r
-\r
- if (x & 7) {\r
- if (x & 1)\r
- return 0;\r
- if (x & 2) {\r
- *y = x >> 1;\r
- return 1;\r
- }\r
- *y = x >> 2;\r
- return 2;\r
- }\r
- k = 0;\r
- if (!(x & 0xffff)) {\r
- k = 16;\r
- x >>= 16;\r
- }\r
- if (!(x & 0xff)) {\r
- k += 8;\r
- x >>= 8;\r
- }\r
- if (!(x & 0xf)) {\r
- k += 4;\r
- x >>= 4;\r
- }\r
- if (!(x & 0x3)) {\r
- k += 2;\r
- x >>= 2;\r
- }\r
- if (!(x & 1)) {\r
- k++;\r
- x >>= 1;\r
- if (!x)\r
- return 32;\r
- }\r
- *y = x;\r
- return k;\r
- }\r
-\r
- Bigint *\r
-multadd\r
-#ifdef KR_headers\r
- (b, m, a) Bigint *b; int m, a;\r
-#else\r
- (Bigint *b, int m, int a) /* multiply by m and add a */\r
-#endif\r
-{\r
- int i, wds;\r
-#ifdef ULLong\r
- ULong *x;\r
- ULLong carry, y;\r
-#else\r
- ULong carry, *x, y;\r
-#ifdef Pack_32\r
- ULong xi, z;\r
-#endif\r
-#endif\r
- Bigint *b1;\r
-\r
- wds = b->wds;\r
- x = b->x;\r
- i = 0;\r
- carry = a;\r
- do {\r
-#ifdef ULLong\r
- y = *x * (ULLong)m + carry;\r
- carry = y >> 32;\r
- /* LINTED conversion */\r
- *x++ = (uint32_t)(y & 0xffffffffUL);\r
-#else\r
-#ifdef Pack_32\r
- xi = *x;\r
- y = (xi & 0xffff) * m + carry;\r
- z = (xi >> 16) * m + (y >> 16);\r
- carry = z >> 16;\r
- *x++ = (z << 16) + (y & 0xffff);\r
-#else\r
- y = *x * m + carry;\r
- carry = y >> 16;\r
- *x++ = y & 0xffff;\r
-#endif\r
-#endif\r
- }\r
- while(++i < wds);\r
- if (carry) {\r
- if (wds >= b->maxwds) {\r
- b1 = Balloc(b->k+1);\r
- if (b1 == NULL) {\r
- Bfree(b);\r
- return NULL;\r
- }\r
- Bcopy(b1, b);\r
- Bfree(b);\r
- b = b1;\r
- }\r
- /* LINTED conversion */\r
- b->x[wds++] = (uint32_t)carry;\r
- b->wds = wds;\r
- }\r
- return b;\r
- }\r
-\r
- int\r
-hi0bits_D2A\r
-#ifdef KR_headers\r
- (x) ULong x;\r
-#else\r
- (ULong x)\r
-#endif\r
-{\r
- int k = 0;\r
-\r
- if (!(x & 0xffff0000)) {\r
- k = 16;\r
- x <<= 16;\r
- }\r
- if (!(x & 0xff000000)) {\r
- k += 8;\r
- x <<= 8;\r
- }\r
- if (!(x & 0xf0000000)) {\r
- k += 4;\r
- x <<= 4;\r
- }\r
- if (!(x & 0xc0000000)) {\r
- k += 2;\r
- x <<= 2;\r
- }\r
- if (!(x & 0x80000000)) {\r
- k++;\r
- if (!(x & 0x40000000))\r
- return 32;\r
- }\r
- return k;\r
- }\r
-\r
- Bigint *\r
-i2b\r
-#ifdef KR_headers\r
- (i) int i;\r
-#else\r
- (int i)\r
-#endif\r
-{\r
- Bigint *b;\r
-\r
- b = Balloc(1);\r
- if (b == NULL)\r
- return NULL;\r
- b->x[0] = i;\r
- b->wds = 1;\r
- return b;\r
- }\r
-\r
- Bigint *\r
-mult\r
-#ifdef KR_headers\r
- (a, b) Bigint *a, *b;\r
-#else\r
- (Bigint *a, Bigint *b)\r
-#endif\r
-{\r
- Bigint *c;\r
- int k, wa, wb, wc;\r
- ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;\r
- ULong y;\r
-#ifdef ULLong\r
- ULLong carry, z;\r
-#else\r
- ULong carry, z;\r
-#ifdef Pack_32\r
- ULong z2;\r
-#endif\r
-#endif\r
-\r
- if (a->wds < b->wds) {\r
- c = a;\r
- a = b;\r
- b = c;\r
- }\r
- k = a->k;\r
- wa = a->wds;\r
- wb = b->wds;\r
- wc = wa + wb;\r
- if (wc > a->maxwds)\r
- k++;\r
- c = Balloc(k);\r
- if (c == NULL)\r
- return NULL;\r
- for(x = c->x, xa = x + wc; x < xa; x++)\r
- *x = 0;\r
- xa = a->x;\r
- xae = xa + wa;\r
- xb = b->x;\r
- xbe = xb + wb;\r
- xc0 = c->x;\r
-#ifdef ULLong\r
- for(; xb < xbe; xc0++) {\r
- if ( (y = *xb++) !=0) {\r
- x = xa;\r
- xc = xc0;\r
- carry = 0;\r
- do {\r
- z = *x++ * (ULLong)y + *xc + carry;\r
- carry = z >> 32;\r
- /* LINTED conversion */\r
- *xc++ = (uint32_t)(z & 0xffffffffUL);\r
- }\r
- while(x < xae);\r
- /* LINTED conversion */\r
- *xc = (uint32_t)carry;\r
- }\r
- }\r
-#else\r
-#ifdef Pack_32\r
- for(; xb < xbe; xb++, xc0++) {\r
- if ( (y = *xb & 0xffff) !=0) {\r
- x = xa;\r
- xc = xc0;\r
- carry = 0;\r
- do {\r
- z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;\r
- carry = z >> 16;\r
- z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;\r
- carry = z2 >> 16;\r
- Storeinc(xc, z2, z);\r
- }\r
- while(x < xae);\r
- *xc = carry;\r
- }\r
- if ( (y = *xb >> 16) !=0) {\r
- x = xa;\r
- xc = xc0;\r
- carry = 0;\r
- z2 = *xc;\r
- do {\r
- z = (*x & 0xffff) * y + (*xc >> 16) + carry;\r
- carry = z >> 16;\r
- Storeinc(xc, z, z2);\r
- z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;\r
- carry = z2 >> 16;\r
- }\r
- while(x < xae);\r
- *xc = z2;\r
- }\r
- }\r
-#else\r
- for(; xb < xbe; xc0++) {\r
- if ( (y = *xb++) !=0) {\r
- x = xa;\r
- xc = xc0;\r
- carry = 0;\r
- do {\r
- z = *x++ * y + *xc + carry;\r
- carry = z >> 16;\r
- *xc++ = z & 0xffff;\r
- }\r
- while(x < xae);\r
- *xc = carry;\r
- }\r
- }\r
-#endif\r
-#endif\r
- for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;\r
- c->wds = wc;\r
- return c;\r
- }\r
-\r
- static Bigint *p5s;\r
-\r
- Bigint *\r
-pow5mult\r
-#ifdef KR_headers\r
- (b, k) Bigint *b; int k;\r
-#else\r
- (Bigint *b, int k)\r
-#endif\r
-{\r
- Bigint *b1, *p5, *p51;\r
- int i;\r
- static CONST int p05[3] = { 5, 25, 125 };\r
-\r
- if ( (i = k & 3) !=0) {\r
- b = multadd(b, p05[i-1], 0);\r
- if (b == NULL)\r
- return NULL;\r
- }\r
-\r
- if ((k = (unsigned int)k >> 2) == 0)\r
- return b;\r
- if ((p5 = p5s) == 0) {\r
- /* first time */\r
-#ifdef MULTIPLE_THREADS\r
- ACQUIRE_DTOA_LOCK(1);\r
- if (!(p5 = p5s)) {\r
- p5 = p5s = i2b(625);\r
- if (p5 == NULL)\r
- return NULL;\r
- p5->next = 0;\r
- }\r
- FREE_DTOA_LOCK(1);\r
-#else\r
- p5 = p5s = i2b(625);\r
- if (p5 == NULL)\r
- return NULL;\r
- p5->next = 0;\r
-#endif\r
- }\r
- for(;;) {\r
- if (k & 1) {\r
- b1 = mult(b, p5);\r
- if (b1 == NULL)\r
- return NULL;\r
- b = b1;\r
- }\r
- if ((k = (unsigned int)k >> 1) == 0)\r
- break;\r
- if ((p51 = p5->next) == 0) {\r
-#ifdef MULTIPLE_THREADS\r
- ACQUIRE_DTOA_LOCK(1);\r
- if (!(p51 = p5->next)) {\r
- p51 = p5->next = mult(p5,p5);\r
- if (p51 == NULL)\r
- return NULL;\r
- p51->next = 0;\r
- }\r
- FREE_DTOA_LOCK(1);\r
-#else\r
- p51 = p5->next = mult(p5,p5);\r
- if (p51 == NULL)\r
- return NULL;\r
- p51->next = 0;\r
-#endif\r
- }\r
- p5 = p51;\r
- }\r
- return b;\r
- }\r
-\r
- Bigint *\r
-lshift\r
-#ifdef KR_headers\r
- (b, k) Bigint *b; int k;\r
-#else\r
- (Bigint *b, int k)\r
-#endif\r
-{\r
- int i, k1, n, n1;\r
- Bigint *b1;\r
- ULong *x, *x1, *xe, z;\r
-\r
- n = (unsigned int)k >> kshift;\r
- k1 = b->k;\r
- n1 = n + b->wds + 1;\r
- for(i = b->maxwds; n1 > i; i <<= 1)\r
- k1++;\r
- b1 = Balloc(k1);\r
- if (b1 == NULL)\r
- return NULL;\r
- x1 = b1->x;\r
- for(i = 0; i < n; i++)\r
- *x1++ = 0;\r
- x = b->x;\r
- xe = x + b->wds;\r
- if (k &= kmask) {\r
-#ifdef Pack_32\r
- k1 = 32 - k;\r
- z = 0;\r
- do {\r
- *x1++ = *x << k | z;\r
- z = *x++ >> k1;\r
- }\r
- while(x < xe);\r
- if ((*x1 = z) !=0)\r
- ++n1;\r
-#else\r
- k1 = 16 - k;\r
- z = 0;\r
- do {\r
- *x1++ = *x << k & 0xffff | z;\r
- z = *x++ >> k1;\r
- }\r
- while(x < xe);\r
- if (*x1 = z)\r
- ++n1;\r
-#endif\r
- }\r
- else do\r
- *x1++ = *x++;\r
- while(x < xe);\r
- b1->wds = n1 - 1;\r
- Bfree(b);\r
- return b1;\r
- }\r
-\r
- int\r
-cmp\r
-#ifdef KR_headers\r
- (a, b) Bigint *a, *b;\r
-#else\r
- (Bigint *a, Bigint *b)\r
-#endif\r
-{\r
- ULong *xa, *xa0, *xb, *xb0;\r
- int i, j;\r
-\r
- i = a->wds;\r
- j = b->wds;\r
-#ifdef DEBUG\r
- if (i > 1 && !a->x[i-1])\r
- Bug("cmp called with a->x[a->wds-1] == 0");\r
- if (j > 1 && !b->x[j-1])\r
- Bug("cmp called with b->x[b->wds-1] == 0");\r
-#endif\r
- if (i -= j)\r
- return i;\r
- xa0 = a->x;\r
- xa = xa0 + j;\r
- xb0 = b->x;\r
- xb = xb0 + j;\r
- for(;;) {\r
- if (*--xa != *--xb)\r
- return *xa < *xb ? -1 : 1;\r
- if (xa <= xa0)\r
- break;\r
- }\r
- return 0;\r
- }\r
-\r
- Bigint *\r
-diff\r
-#ifdef KR_headers\r
- (a, b) Bigint *a, *b;\r
-#else\r
- (Bigint *a, Bigint *b)\r
-#endif\r
-{\r
- Bigint *c;\r
- int i, wa, wb;\r
- ULong *xa, *xae, *xb, *xbe, *xc;\r
-#ifdef ULLong\r
- ULLong borrow, y;\r
-#else\r
- ULong borrow, y;\r
-#ifdef Pack_32\r
- ULong z;\r
-#endif\r
-#endif\r
-\r
- i = cmp(a,b);\r
- if (!i) {\r
- c = Balloc(0);\r
- if (c == NULL)\r
- return NULL;\r
- c->wds = 1;\r
- c->x[0] = 0;\r
- return c;\r
- }\r
- if (i < 0) {\r
- c = a;\r
- a = b;\r
- b = c;\r
- i = 1;\r
- }\r
- else\r
- i = 0;\r
- c = Balloc(a->k);\r
- if (c == NULL)\r
- return NULL;\r
- c->sign = i;\r
- wa = a->wds;\r
- xa = a->x;\r
- xae = xa + wa;\r
- wb = b->wds;\r
- xb = b->x;\r
- xbe = xb + wb;\r
- xc = c->x;\r
- borrow = 0;\r
-#ifdef ULLong\r
- do {\r
- y = (ULLong)*xa++ - *xb++ - borrow;\r
- borrow = y >> 32 & 1UL;\r
- /* LINTED conversion */\r
- *xc++ = (uint32_t)(y & 0xffffffffUL);\r
- }\r
- while(xb < xbe);\r
- while(xa < xae) {\r
- y = *xa++ - borrow;\r
- borrow = y >> 32 & 1UL;\r
- /* LINTED conversion */\r
- *xc++ = (uint32_t)(y & 0xffffffffUL);\r
- }\r
-#else\r
-#ifdef Pack_32\r
- do {\r
- y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;\r
- borrow = (y & 0x10000) >> 16;\r
- z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;\r
- borrow = (z & 0x10000) >> 16;\r
- Storeinc(xc, z, y);\r
- }\r
- while(xb < xbe);\r
- while(xa < xae) {\r
- y = (*xa & 0xffff) - borrow;\r
- borrow = (y & 0x10000) >> 16;\r
- z = (*xa++ >> 16) - borrow;\r
- borrow = (z & 0x10000) >> 16;\r
- Storeinc(xc, z, y);\r
- }\r
-#else\r
- do {\r
- y = *xa++ - *xb++ - borrow;\r
- borrow = (y & 0x10000) >> 16;\r
- *xc++ = y & 0xffff;\r
- }\r
- while(xb < xbe);\r
- while(xa < xae) {\r
- y = *xa++ - borrow;\r
- borrow = (y & 0x10000) >> 16;\r
- *xc++ = y & 0xffff;\r
- }\r
-#endif\r
-#endif\r
- while(!*--xc)\r
- wa--;\r
- c->wds = wa;\r
- return c;\r
- }\r
-\r
- double\r
-b2d\r
-#ifdef KR_headers\r
- (a, e) Bigint *a; int *e;\r
-#else\r
- (Bigint *a, int *e)\r
-#endif\r
-{\r
- ULong *xa, *xa0, w, y, z;\r
- int k;\r
- double d;\r
-#ifdef VAX\r
- ULong d0, d1;\r
-#else\r
-#define d0 word0(d)\r
-#define d1 word1(d)\r
-#endif\r
-\r
- xa0 = a->x;\r
- xa = xa0 + a->wds;\r
- y = *--xa;\r
-#ifdef DEBUG\r
- if (!y) Bug("zero y in b2d");\r
-#endif\r
- k = hi0bits(y);\r
- *e = 32 - k;\r
-#ifdef Pack_32\r
- if (k < Ebits) {\r
- d0 = (UINT32)(Exp_1 | y >> (Ebits - k));\r
- w = xa > xa0 ? *--xa : 0;\r
- d1 = (UINT32)(y << ((32-Ebits) + k) | w >> (Ebits - k));\r
- goto ret_d;\r
- }\r
- z = xa > xa0 ? *--xa : 0;\r
- if (k -= Ebits) {\r
- d0 = (UINT32)(Exp_1 | y << k | z >> (32 - k));\r
- y = xa > xa0 ? *--xa : 0;\r
- d1 = (UINT32)(z << k | y >> (32 - k));\r
- }\r
- else {\r
- d0 = (UINT32)(Exp_1 | y);\r
- d1 = (UINT32)z;\r
- }\r
-#else\r
- if (k < Ebits + 16) {\r
- z = xa > xa0 ? *--xa : 0;\r
- d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;\r
- w = xa > xa0 ? *--xa : 0;\r
- y = xa > xa0 ? *--xa : 0;\r
- d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;\r
- goto ret_d;\r
- }\r
- z = xa > xa0 ? *--xa : 0;\r
- w = xa > xa0 ? *--xa : 0;\r
- k -= Ebits + 16;\r
- d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;\r
- y = xa > xa0 ? *--xa : 0;\r
- d1 = w << k + 16 | y << k;\r
-#endif\r
- ret_d:\r
-#ifdef VAX\r
- word0(d) = d0 >> 16 | d0 << 16;\r
- word1(d) = d1 >> 16 | d1 << 16;\r
-#endif\r
- return dval(d);\r
- }\r
-#undef d0\r
-#undef d1\r
-\r
- Bigint *\r
-d2b\r
-#ifdef KR_headers\r
- (d, e, bits) double d; int *e, *bits;\r
-#else\r
- (double d, int *e, int *bits)\r
-#endif\r
-{\r
- Bigint *b;\r
-#ifndef Sudden_Underflow\r
- int i;\r
-#endif\r
- int de, k;\r
- ULong *x, y, z;\r
-#ifdef VAX\r
- ULong d0, d1;\r
- d0 = word0(d) >> 16 | word0(d) << 16;\r
- d1 = word1(d) >> 16 | word1(d) << 16;\r
-#else\r
-#define d0 word0(d)\r
-#define d1 word1(d)\r
-#endif\r
-\r
-#ifdef Pack_32\r
- b = Balloc(1);\r
-#else\r
- b = Balloc(2);\r
-#endif\r
- if (b == NULL)\r
- return NULL;\r
- x = b->x;\r
-\r
- z = d0 & Frac_mask;\r
- d0 &= 0x7fffffff; /* clear sign bit, which we ignore */\r
-#ifdef Sudden_Underflow\r
- de = (int)(d0 >> Exp_shift);\r
-#ifndef IBM\r
- z |= Exp_msk11;\r
-#endif\r
-#else\r
- if ( (de = (int)(d0 >> Exp_shift)) !=0)\r
- z |= Exp_msk1;\r
-#endif\r
-#ifdef Pack_32\r
- if ( (y = d1) !=0) {\r
- if ( (k = lo0bits(&y)) !=0) {\r
- x[0] = y | z << (32 - k);\r
- z >>= k;\r
- }\r
- else\r
- x[0] = y;\r
-#ifndef Sudden_Underflow\r
- i =\r
-#endif\r
- b->wds = (x[1] = z) !=0 ? 2 : 1;\r
- }\r
- else {\r
-#ifdef DEBUG\r
- if (!z)\r
- Bug("Zero passed to d2b");\r
-#endif\r
- k = lo0bits(&z);\r
- x[0] = z;\r
-#ifndef Sudden_Underflow\r
- i =\r
-#endif\r
- b->wds = 1;\r
- k += 32;\r
- }\r
-#else\r
- if ( (y = d1) !=0) {\r
- if ( (k = lo0bits(&y)) !=0)\r
- if (k >= 16) {\r
- x[0] = y | z << 32 - k & 0xffff;\r
- x[1] = z >> k - 16 & 0xffff;\r
- x[2] = z >> k;\r
- i = 2;\r
- }\r
- else {\r
- x[0] = y & 0xffff;\r
- x[1] = y >> 16 | z << 16 - k & 0xffff;\r
- x[2] = z >> k & 0xffff;\r
- x[3] = z >> k+16;\r
- i = 3;\r
- }\r
- else {\r
- x[0] = y & 0xffff;\r
- x[1] = y >> 16;\r
- x[2] = z & 0xffff;\r
- x[3] = z >> 16;\r
- i = 3;\r
- }\r
- }\r
- else {\r
-#ifdef DEBUG\r
- if (!z)\r
- Bug("Zero passed to d2b");\r
-#endif\r
- k = lo0bits(&z);\r
- if (k >= 16) {\r
- x[0] = z;\r
- i = 0;\r
- }\r
- else {\r
- x[0] = z & 0xffff;\r
- x[1] = z >> 16;\r
- i = 1;\r
- }\r
- k += 32;\r
- }\r
- while(!x[i])\r
- --i;\r
- b->wds = i + 1;\r
-#endif\r
-#ifndef Sudden_Underflow\r
- if (de) {\r
-#endif\r
-#ifdef IBM\r
- *e = (de - Bias - (P-1) << 2) + k;\r
- *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);\r
-#else\r
- *e = de - Bias - (P-1) + k;\r
- *bits = P - k;\r
-#endif\r
-#ifndef Sudden_Underflow\r
- }\r
- else {\r
- *e = de - Bias - (P-1) + 1 + k;\r
-#ifdef Pack_32\r
- *bits = 32*i - hi0bits(x[i-1]);\r
-#else\r
- *bits = (i+2)*16 - hi0bits(x[i]);\r
-#endif\r
- }\r
-#endif\r
- return b;\r
- }\r
-#undef d0\r
-#undef d1\r
-\r
- CONST double\r
-#ifdef IEEE_Arith\r
-bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };\r
-CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256\r
- };\r
-#else\r
-#ifdef IBM\r
-bigtens[] = { 1e16, 1e32, 1e64 };\r
-CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };\r
-#else\r
-bigtens[] = { 1e16, 1e32 };\r
-CONST double tinytens[] = { 1e-16, 1e-32 };\r
-#endif\r
-#endif\r
-\r
- CONST double\r
-tens[] = {\r
- 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,\r
- 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,\r
- 1e20, 1e21, 1e22\r
-#ifdef VAX\r
- , 1e23, 1e24\r
-#endif\r
- };\r
-\r
- char *\r
-#ifdef KR_headers\r
-strcp_D2A(a, b) char *a; char *b;\r
-#else\r
-strcp_D2A(char *a, CONST char *b)\r
-#endif\r
-{\r
- while((*a = *b++))\r
- a++;\r
- return a;\r
- }\r
-\r
-#ifdef NO_STRING_H\r
-\r
- Char *\r
-#ifdef KR_headers\r
-memcpy_D2A(a, b, len) Char *a; Char *b; size_t len;\r
-#else\r
-memcpy_D2A(void *a1, void *b1, size_t len)\r
-#endif\r
-{\r
- char *a = (char*)a1, *ae = a + len;\r
- char *b = (char*)b1, *a0 = a;\r
- while(a < ae)\r
- *a++ = *b++;\r
- return a0;\r
- }\r
-\r
-#endif /* NO_STRING_H */\r