1f9f848faSopenharmony_ci/****************************************************************
2f9f848faSopenharmony_ci
3f9f848faSopenharmony_ciThe author of this software is David M. Gay.
4f9f848faSopenharmony_ci
5f9f848faSopenharmony_ciCopyright (C) 1998, 1999 by Lucent Technologies
6f9f848faSopenharmony_ciAll Rights Reserved
7f9f848faSopenharmony_ci
8f9f848faSopenharmony_ciPermission to use, copy, modify, and distribute this software and
9f9f848faSopenharmony_ciits documentation for any purpose and without fee is hereby
10f9f848faSopenharmony_cigranted, provided that the above copyright notice appear in all
11f9f848faSopenharmony_cicopies and that both that the copyright notice and this
12f9f848faSopenharmony_cipermission notice and warranty disclaimer appear in supporting
13f9f848faSopenharmony_cidocumentation, and that the name of Lucent or any of its entities
14f9f848faSopenharmony_cinot be used in advertising or publicity pertaining to
15f9f848faSopenharmony_cidistribution of the software without specific, written prior
16f9f848faSopenharmony_cipermission.
17f9f848faSopenharmony_ci
18f9f848faSopenharmony_ciLUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
19f9f848faSopenharmony_ciINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
20f9f848faSopenharmony_ciIN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
21f9f848faSopenharmony_ciSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22f9f848faSopenharmony_ciWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
23f9f848faSopenharmony_ciIN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24f9f848faSopenharmony_ciARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
25f9f848faSopenharmony_ciTHIS SOFTWARE.
26f9f848faSopenharmony_ci
27f9f848faSopenharmony_ci****************************************************************/
28f9f848faSopenharmony_ci
29f9f848faSopenharmony_ci/* Please send bug reports to David M. Gay (dmg at acm dot org,
30f9f848faSopenharmony_ci * with " at " changed at "@" and " dot " changed to ".").	*/
31f9f848faSopenharmony_ci
32f9f848faSopenharmony_ci#include "gdtoaimp.h"
33f9f848faSopenharmony_ci
34f9f848faSopenharmony_ci static Bigint *freelist[Kmax+1];
35f9f848faSopenharmony_ci#ifndef Omit_Private_Memory
36f9f848faSopenharmony_ci#ifndef PRIVATE_MEM
37f9f848faSopenharmony_ci#define PRIVATE_MEM 2304
38f9f848faSopenharmony_ci#endif
39f9f848faSopenharmony_ci#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
40f9f848faSopenharmony_cistatic double private_mem[PRIVATE_mem], *pmem_next = private_mem;
41f9f848faSopenharmony_ci#endif
42f9f848faSopenharmony_ci
43f9f848faSopenharmony_ci Bigint *
44f9f848faSopenharmony_ciBalloc
45f9f848faSopenharmony_ci#ifdef KR_headers
46f9f848faSopenharmony_ci	(k) int k;
47f9f848faSopenharmony_ci#else
48f9f848faSopenharmony_ci	(int k)
49f9f848faSopenharmony_ci#endif
50f9f848faSopenharmony_ci{
51f9f848faSopenharmony_ci	int x;
52f9f848faSopenharmony_ci	Bigint *rv;
53f9f848faSopenharmony_ci#ifndef Omit_Private_Memory
54f9f848faSopenharmony_ci	unsigned int len;
55f9f848faSopenharmony_ci#endif
56f9f848faSopenharmony_ci
57f9f848faSopenharmony_ci	ACQUIRE_DTOA_LOCK(0);
58f9f848faSopenharmony_ci	/* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
59f9f848faSopenharmony_ci	/* but this case seems very unlikely. */
60f9f848faSopenharmony_ci	if (k <= Kmax && (rv = freelist[k]) !=0) {
61f9f848faSopenharmony_ci		freelist[k] = rv->next;
62f9f848faSopenharmony_ci		}
63f9f848faSopenharmony_ci	else {
64f9f848faSopenharmony_ci		x = 1 << k;
65f9f848faSopenharmony_ci#ifdef Omit_Private_Memory
66f9f848faSopenharmony_ci		rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
67f9f848faSopenharmony_ci#else
68f9f848faSopenharmony_ci		len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
69f9f848faSopenharmony_ci			/sizeof(double);
70f9f848faSopenharmony_ci		if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
71f9f848faSopenharmony_ci			rv = (Bigint*)pmem_next;
72f9f848faSopenharmony_ci			pmem_next += len;
73f9f848faSopenharmony_ci			}
74f9f848faSopenharmony_ci		else
75f9f848faSopenharmony_ci			rv = (Bigint*)MALLOC(len*sizeof(double));
76f9f848faSopenharmony_ci#endif
77f9f848faSopenharmony_ci		rv->k = k;
78f9f848faSopenharmony_ci		rv->maxwds = x;
79f9f848faSopenharmony_ci		}
80f9f848faSopenharmony_ci	FREE_DTOA_LOCK(0);
81f9f848faSopenharmony_ci	rv->sign = rv->wds = 0;
82f9f848faSopenharmony_ci	return rv;
83f9f848faSopenharmony_ci	}
84f9f848faSopenharmony_ci
85f9f848faSopenharmony_ci void
86f9f848faSopenharmony_ciBfree
87f9f848faSopenharmony_ci#ifdef KR_headers
88f9f848faSopenharmony_ci	(v) Bigint *v;
89f9f848faSopenharmony_ci#else
90f9f848faSopenharmony_ci	(Bigint *v)
91f9f848faSopenharmony_ci#endif
92f9f848faSopenharmony_ci{
93f9f848faSopenharmony_ci	if (v) {
94f9f848faSopenharmony_ci		if (v->k > Kmax)
95f9f848faSopenharmony_ci#ifdef FREE
96f9f848faSopenharmony_ci			FREE((void*)v);
97f9f848faSopenharmony_ci#else
98f9f848faSopenharmony_ci			free((void*)v);
99f9f848faSopenharmony_ci#endif
100f9f848faSopenharmony_ci		else {
101f9f848faSopenharmony_ci			ACQUIRE_DTOA_LOCK(0);
102f9f848faSopenharmony_ci			v->next = freelist[v->k];
103f9f848faSopenharmony_ci			freelist[v->k] = v;
104f9f848faSopenharmony_ci			FREE_DTOA_LOCK(0);
105f9f848faSopenharmony_ci			}
106f9f848faSopenharmony_ci		}
107f9f848faSopenharmony_ci	}
108f9f848faSopenharmony_ci
109f9f848faSopenharmony_ci int
110f9f848faSopenharmony_cilo0bits
111f9f848faSopenharmony_ci#ifdef KR_headers
112f9f848faSopenharmony_ci	(y) ULong *y;
113f9f848faSopenharmony_ci#else
114f9f848faSopenharmony_ci	(ULong *y)
115f9f848faSopenharmony_ci#endif
116f9f848faSopenharmony_ci{
117f9f848faSopenharmony_ci	int k;
118f9f848faSopenharmony_ci	ULong x = *y;
119f9f848faSopenharmony_ci
120f9f848faSopenharmony_ci	if (x & 7) {
121f9f848faSopenharmony_ci		if (x & 1)
122f9f848faSopenharmony_ci			return 0;
123f9f848faSopenharmony_ci		if (x & 2) {
124f9f848faSopenharmony_ci			*y = x >> 1;
125f9f848faSopenharmony_ci			return 1;
126f9f848faSopenharmony_ci			}
127f9f848faSopenharmony_ci		*y = x >> 2;
128f9f848faSopenharmony_ci		return 2;
129f9f848faSopenharmony_ci		}
130f9f848faSopenharmony_ci	k = 0;
131f9f848faSopenharmony_ci	if (!(x & 0xffff)) {
132f9f848faSopenharmony_ci		k = 16;
133f9f848faSopenharmony_ci		x >>= 16;
134f9f848faSopenharmony_ci		}
135f9f848faSopenharmony_ci	if (!(x & 0xff)) {
136f9f848faSopenharmony_ci		k += 8;
137f9f848faSopenharmony_ci		x >>= 8;
138f9f848faSopenharmony_ci		}
139f9f848faSopenharmony_ci	if (!(x & 0xf)) {
140f9f848faSopenharmony_ci		k += 4;
141f9f848faSopenharmony_ci		x >>= 4;
142f9f848faSopenharmony_ci		}
143f9f848faSopenharmony_ci	if (!(x & 0x3)) {
144f9f848faSopenharmony_ci		k += 2;
145f9f848faSopenharmony_ci		x >>= 2;
146f9f848faSopenharmony_ci		}
147f9f848faSopenharmony_ci	if (!(x & 1)) {
148f9f848faSopenharmony_ci		k++;
149f9f848faSopenharmony_ci		x >>= 1;
150f9f848faSopenharmony_ci		if (!x)
151f9f848faSopenharmony_ci			return 32;
152f9f848faSopenharmony_ci		}
153f9f848faSopenharmony_ci	*y = x;
154f9f848faSopenharmony_ci	return k;
155f9f848faSopenharmony_ci	}
156f9f848faSopenharmony_ci
157f9f848faSopenharmony_ci Bigint *
158f9f848faSopenharmony_cimultadd
159f9f848faSopenharmony_ci#ifdef KR_headers
160f9f848faSopenharmony_ci	(b, m, a) Bigint *b; int m, a;
161f9f848faSopenharmony_ci#else
162f9f848faSopenharmony_ci	(Bigint *b, int m, int a)	/* multiply by m and add a */
163f9f848faSopenharmony_ci#endif
164f9f848faSopenharmony_ci{
165f9f848faSopenharmony_ci	int i, wds;
166f9f848faSopenharmony_ci#ifdef ULLong
167f9f848faSopenharmony_ci	ULong *x;
168f9f848faSopenharmony_ci	ULLong carry, y;
169f9f848faSopenharmony_ci#else
170f9f848faSopenharmony_ci	ULong carry, *x, y;
171f9f848faSopenharmony_ci#ifdef Pack_32
172f9f848faSopenharmony_ci	ULong xi, z;
173f9f848faSopenharmony_ci#endif
174f9f848faSopenharmony_ci#endif
175f9f848faSopenharmony_ci	Bigint *b1;
176f9f848faSopenharmony_ci
177f9f848faSopenharmony_ci	wds = b->wds;
178f9f848faSopenharmony_ci	x = b->x;
179f9f848faSopenharmony_ci	i = 0;
180f9f848faSopenharmony_ci	carry = a;
181f9f848faSopenharmony_ci	do {
182f9f848faSopenharmony_ci#ifdef ULLong
183f9f848faSopenharmony_ci		y = *x * (ULLong)m + carry;
184f9f848faSopenharmony_ci		carry = y >> 32;
185f9f848faSopenharmony_ci		*x++ = y & 0xffffffffUL;
186f9f848faSopenharmony_ci#else
187f9f848faSopenharmony_ci#ifdef Pack_32
188f9f848faSopenharmony_ci		xi = *x;
189f9f848faSopenharmony_ci		y = (xi & 0xffff) * m + carry;
190f9f848faSopenharmony_ci		z = (xi >> 16) * m + (y >> 16);
191f9f848faSopenharmony_ci		carry = z >> 16;
192f9f848faSopenharmony_ci		*x++ = (z << 16) + (y & 0xffff);
193f9f848faSopenharmony_ci#else
194f9f848faSopenharmony_ci		y = *x * m + carry;
195f9f848faSopenharmony_ci		carry = y >> 16;
196f9f848faSopenharmony_ci		*x++ = y & 0xffff;
197f9f848faSopenharmony_ci#endif
198f9f848faSopenharmony_ci#endif
199f9f848faSopenharmony_ci		}
200f9f848faSopenharmony_ci		while(++i < wds);
201f9f848faSopenharmony_ci	if (carry) {
202f9f848faSopenharmony_ci		if (wds >= b->maxwds) {
203f9f848faSopenharmony_ci			b1 = Balloc(b->k+1);
204f9f848faSopenharmony_ci			Bcopy(b1, b);
205f9f848faSopenharmony_ci			Bfree(b);
206f9f848faSopenharmony_ci			b = b1;
207f9f848faSopenharmony_ci			}
208f9f848faSopenharmony_ci		b->x[wds++] = carry;
209f9f848faSopenharmony_ci		b->wds = wds;
210f9f848faSopenharmony_ci		}
211f9f848faSopenharmony_ci	return b;
212f9f848faSopenharmony_ci	}
213f9f848faSopenharmony_ci
214f9f848faSopenharmony_ci int
215f9f848faSopenharmony_cihi0bits_D2A
216f9f848faSopenharmony_ci#ifdef KR_headers
217f9f848faSopenharmony_ci	(x) ULong x;
218f9f848faSopenharmony_ci#else
219f9f848faSopenharmony_ci	(ULong x)
220f9f848faSopenharmony_ci#endif
221f9f848faSopenharmony_ci{
222f9f848faSopenharmony_ci	int k = 0;
223f9f848faSopenharmony_ci
224f9f848faSopenharmony_ci	if (!(x & 0xffff0000)) {
225f9f848faSopenharmony_ci		k = 16;
226f9f848faSopenharmony_ci		x <<= 16;
227f9f848faSopenharmony_ci		}
228f9f848faSopenharmony_ci	if (!(x & 0xff000000)) {
229f9f848faSopenharmony_ci		k += 8;
230f9f848faSopenharmony_ci		x <<= 8;
231f9f848faSopenharmony_ci		}
232f9f848faSopenharmony_ci	if (!(x & 0xf0000000)) {
233f9f848faSopenharmony_ci		k += 4;
234f9f848faSopenharmony_ci		x <<= 4;
235f9f848faSopenharmony_ci		}
236f9f848faSopenharmony_ci	if (!(x & 0xc0000000)) {
237f9f848faSopenharmony_ci		k += 2;
238f9f848faSopenharmony_ci		x <<= 2;
239f9f848faSopenharmony_ci		}
240f9f848faSopenharmony_ci	if (!(x & 0x80000000)) {
241f9f848faSopenharmony_ci		k++;
242f9f848faSopenharmony_ci		if (!(x & 0x40000000))
243f9f848faSopenharmony_ci			return 32;
244f9f848faSopenharmony_ci		}
245f9f848faSopenharmony_ci	return k;
246f9f848faSopenharmony_ci	}
247f9f848faSopenharmony_ci
248f9f848faSopenharmony_ci Bigint *
249f9f848faSopenharmony_cii2b
250f9f848faSopenharmony_ci#ifdef KR_headers
251f9f848faSopenharmony_ci	(i) int i;
252f9f848faSopenharmony_ci#else
253f9f848faSopenharmony_ci	(int i)
254f9f848faSopenharmony_ci#endif
255f9f848faSopenharmony_ci{
256f9f848faSopenharmony_ci	Bigint *b;
257f9f848faSopenharmony_ci
258f9f848faSopenharmony_ci	b = Balloc(1);
259f9f848faSopenharmony_ci	b->x[0] = i;
260f9f848faSopenharmony_ci	b->wds = 1;
261f9f848faSopenharmony_ci	return b;
262f9f848faSopenharmony_ci	}
263f9f848faSopenharmony_ci
264f9f848faSopenharmony_ci Bigint *
265f9f848faSopenharmony_cimult
266f9f848faSopenharmony_ci#ifdef KR_headers
267f9f848faSopenharmony_ci	(a, b) Bigint *a, *b;
268f9f848faSopenharmony_ci#else
269f9f848faSopenharmony_ci	(Bigint *a, Bigint *b)
270f9f848faSopenharmony_ci#endif
271f9f848faSopenharmony_ci{
272f9f848faSopenharmony_ci	Bigint *c;
273f9f848faSopenharmony_ci	int k, wa, wb, wc;
274f9f848faSopenharmony_ci	ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
275f9f848faSopenharmony_ci	ULong y;
276f9f848faSopenharmony_ci#ifdef ULLong
277f9f848faSopenharmony_ci	ULLong carry, z;
278f9f848faSopenharmony_ci#else
279f9f848faSopenharmony_ci	ULong carry, z;
280f9f848faSopenharmony_ci#ifdef Pack_32
281f9f848faSopenharmony_ci	ULong z2;
282f9f848faSopenharmony_ci#endif
283f9f848faSopenharmony_ci#endif
284f9f848faSopenharmony_ci
285f9f848faSopenharmony_ci	if (a->wds < b->wds) {
286f9f848faSopenharmony_ci		c = a;
287f9f848faSopenharmony_ci		a = b;
288f9f848faSopenharmony_ci		b = c;
289f9f848faSopenharmony_ci		}
290f9f848faSopenharmony_ci	k = a->k;
291f9f848faSopenharmony_ci	wa = a->wds;
292f9f848faSopenharmony_ci	wb = b->wds;
293f9f848faSopenharmony_ci	wc = wa + wb;
294f9f848faSopenharmony_ci	if (wc > a->maxwds)
295f9f848faSopenharmony_ci		k++;
296f9f848faSopenharmony_ci	c = Balloc(k);
297f9f848faSopenharmony_ci	for(x = c->x, xa = x + wc; x < xa; x++)
298f9f848faSopenharmony_ci		*x = 0;
299f9f848faSopenharmony_ci	xa = a->x;
300f9f848faSopenharmony_ci	xae = xa + wa;
301f9f848faSopenharmony_ci	xb = b->x;
302f9f848faSopenharmony_ci	xbe = xb + wb;
303f9f848faSopenharmony_ci	xc0 = c->x;
304f9f848faSopenharmony_ci#ifdef ULLong
305f9f848faSopenharmony_ci	for(; xb < xbe; xc0++) {
306f9f848faSopenharmony_ci		if ( (y = *xb++) !=0) {
307f9f848faSopenharmony_ci			x = xa;
308f9f848faSopenharmony_ci			xc = xc0;
309f9f848faSopenharmony_ci			carry = 0;
310f9f848faSopenharmony_ci			do {
311f9f848faSopenharmony_ci				z = *x++ * (ULLong)y + *xc + carry;
312f9f848faSopenharmony_ci				carry = z >> 32;
313f9f848faSopenharmony_ci				*xc++ = z & 0xffffffffUL;
314f9f848faSopenharmony_ci				}
315f9f848faSopenharmony_ci				while(x < xae);
316f9f848faSopenharmony_ci			*xc = carry;
317f9f848faSopenharmony_ci			}
318f9f848faSopenharmony_ci		}
319f9f848faSopenharmony_ci#else
320f9f848faSopenharmony_ci#ifdef Pack_32
321f9f848faSopenharmony_ci	for(; xb < xbe; xb++, xc0++) {
322f9f848faSopenharmony_ci		if ( (y = *xb & 0xffff) !=0) {
323f9f848faSopenharmony_ci			x = xa;
324f9f848faSopenharmony_ci			xc = xc0;
325f9f848faSopenharmony_ci			carry = 0;
326f9f848faSopenharmony_ci			do {
327f9f848faSopenharmony_ci				z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
328f9f848faSopenharmony_ci				carry = z >> 16;
329f9f848faSopenharmony_ci				z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
330f9f848faSopenharmony_ci				carry = z2 >> 16;
331f9f848faSopenharmony_ci				Storeinc(xc, z2, z);
332f9f848faSopenharmony_ci				}
333f9f848faSopenharmony_ci				while(x < xae);
334f9f848faSopenharmony_ci			*xc = carry;
335f9f848faSopenharmony_ci			}
336f9f848faSopenharmony_ci		if ( (y = *xb >> 16) !=0) {
337f9f848faSopenharmony_ci			x = xa;
338f9f848faSopenharmony_ci			xc = xc0;
339f9f848faSopenharmony_ci			carry = 0;
340f9f848faSopenharmony_ci			z2 = *xc;
341f9f848faSopenharmony_ci			do {
342f9f848faSopenharmony_ci				z = (*x & 0xffff) * y + (*xc >> 16) + carry;
343f9f848faSopenharmony_ci				carry = z >> 16;
344f9f848faSopenharmony_ci				Storeinc(xc, z, z2);
345f9f848faSopenharmony_ci				z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
346f9f848faSopenharmony_ci				carry = z2 >> 16;
347f9f848faSopenharmony_ci				}
348f9f848faSopenharmony_ci				while(x < xae);
349f9f848faSopenharmony_ci			*xc = z2;
350f9f848faSopenharmony_ci			}
351f9f848faSopenharmony_ci		}
352f9f848faSopenharmony_ci#else
353f9f848faSopenharmony_ci	for(; xb < xbe; xc0++) {
354f9f848faSopenharmony_ci		if ( (y = *xb++) !=0) {
355f9f848faSopenharmony_ci			x = xa;
356f9f848faSopenharmony_ci			xc = xc0;
357f9f848faSopenharmony_ci			carry = 0;
358f9f848faSopenharmony_ci			do {
359f9f848faSopenharmony_ci				z = *x++ * y + *xc + carry;
360f9f848faSopenharmony_ci				carry = z >> 16;
361f9f848faSopenharmony_ci				*xc++ = z & 0xffff;
362f9f848faSopenharmony_ci				}
363f9f848faSopenharmony_ci				while(x < xae);
364f9f848faSopenharmony_ci			*xc = carry;
365f9f848faSopenharmony_ci			}
366f9f848faSopenharmony_ci		}
367f9f848faSopenharmony_ci#endif
368f9f848faSopenharmony_ci#endif
369f9f848faSopenharmony_ci	for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
370f9f848faSopenharmony_ci	c->wds = wc;
371f9f848faSopenharmony_ci	return c;
372f9f848faSopenharmony_ci	}
373f9f848faSopenharmony_ci
374f9f848faSopenharmony_ci static Bigint *p5s;
375f9f848faSopenharmony_ci
376f9f848faSopenharmony_ci Bigint *
377f9f848faSopenharmony_cipow5mult
378f9f848faSopenharmony_ci#ifdef KR_headers
379f9f848faSopenharmony_ci	(b, k) Bigint *b; int k;
380f9f848faSopenharmony_ci#else
381f9f848faSopenharmony_ci	(Bigint *b, int k)
382f9f848faSopenharmony_ci#endif
383f9f848faSopenharmony_ci{
384f9f848faSopenharmony_ci	Bigint *b1, *p5, *p51;
385f9f848faSopenharmony_ci	int i;
386f9f848faSopenharmony_ci	static int p05[3] = { 5, 25, 125 };
387f9f848faSopenharmony_ci
388f9f848faSopenharmony_ci	if ( (i = k & 3) !=0)
389f9f848faSopenharmony_ci		b = multadd(b, p05[i-1], 0);
390f9f848faSopenharmony_ci
391f9f848faSopenharmony_ci	if (!(k >>= 2))
392f9f848faSopenharmony_ci		return b;
393f9f848faSopenharmony_ci	if ((p5 = p5s) == 0) {
394f9f848faSopenharmony_ci		/* first time */
395f9f848faSopenharmony_ci#ifdef MULTIPLE_THREADS
396f9f848faSopenharmony_ci		ACQUIRE_DTOA_LOCK(1);
397f9f848faSopenharmony_ci		if (!(p5 = p5s)) {
398f9f848faSopenharmony_ci			p5 = p5s = i2b(625);
399f9f848faSopenharmony_ci			p5->next = 0;
400f9f848faSopenharmony_ci			}
401f9f848faSopenharmony_ci		FREE_DTOA_LOCK(1);
402f9f848faSopenharmony_ci#else
403f9f848faSopenharmony_ci		p5 = p5s = i2b(625);
404f9f848faSopenharmony_ci		p5->next = 0;
405f9f848faSopenharmony_ci#endif
406f9f848faSopenharmony_ci		}
407f9f848faSopenharmony_ci	for(;;) {
408f9f848faSopenharmony_ci		if (k & 1) {
409f9f848faSopenharmony_ci			b1 = mult(b, p5);
410f9f848faSopenharmony_ci			Bfree(b);
411f9f848faSopenharmony_ci			b = b1;
412f9f848faSopenharmony_ci			}
413f9f848faSopenharmony_ci		if (!(k >>= 1))
414f9f848faSopenharmony_ci			break;
415f9f848faSopenharmony_ci		if ((p51 = p5->next) == 0) {
416f9f848faSopenharmony_ci#ifdef MULTIPLE_THREADS
417f9f848faSopenharmony_ci			ACQUIRE_DTOA_LOCK(1);
418f9f848faSopenharmony_ci			if (!(p51 = p5->next)) {
419f9f848faSopenharmony_ci				p51 = p5->next = mult(p5,p5);
420f9f848faSopenharmony_ci				p51->next = 0;
421f9f848faSopenharmony_ci				}
422f9f848faSopenharmony_ci			FREE_DTOA_LOCK(1);
423f9f848faSopenharmony_ci#else
424f9f848faSopenharmony_ci			p51 = p5->next = mult(p5,p5);
425f9f848faSopenharmony_ci			p51->next = 0;
426f9f848faSopenharmony_ci#endif
427f9f848faSopenharmony_ci			}
428f9f848faSopenharmony_ci		p5 = p51;
429f9f848faSopenharmony_ci		}
430f9f848faSopenharmony_ci	return b;
431f9f848faSopenharmony_ci	}
432f9f848faSopenharmony_ci
433f9f848faSopenharmony_ci Bigint *
434f9f848faSopenharmony_cilshift
435f9f848faSopenharmony_ci#ifdef KR_headers
436f9f848faSopenharmony_ci	(b, k) Bigint *b; int k;
437f9f848faSopenharmony_ci#else
438f9f848faSopenharmony_ci	(Bigint *b, int k)
439f9f848faSopenharmony_ci#endif
440f9f848faSopenharmony_ci{
441f9f848faSopenharmony_ci	int i, k1, n, n1;
442f9f848faSopenharmony_ci	Bigint *b1;
443f9f848faSopenharmony_ci	ULong *x, *x1, *xe, z;
444f9f848faSopenharmony_ci
445f9f848faSopenharmony_ci	n = k >> kshift;
446f9f848faSopenharmony_ci	k1 = b->k;
447f9f848faSopenharmony_ci	n1 = n + b->wds + 1;
448f9f848faSopenharmony_ci	for(i = b->maxwds; n1 > i; i <<= 1)
449f9f848faSopenharmony_ci		k1++;
450f9f848faSopenharmony_ci	b1 = Balloc(k1);
451f9f848faSopenharmony_ci	x1 = b1->x;
452f9f848faSopenharmony_ci	for(i = 0; i < n; i++)
453f9f848faSopenharmony_ci		*x1++ = 0;
454f9f848faSopenharmony_ci	x = b->x;
455f9f848faSopenharmony_ci	xe = x + b->wds;
456f9f848faSopenharmony_ci	if (k &= kmask) {
457f9f848faSopenharmony_ci#ifdef Pack_32
458f9f848faSopenharmony_ci		k1 = 32 - k;
459f9f848faSopenharmony_ci		z = 0;
460f9f848faSopenharmony_ci		do {
461f9f848faSopenharmony_ci			*x1++ = *x << k | z;
462f9f848faSopenharmony_ci			z = *x++ >> k1;
463f9f848faSopenharmony_ci			}
464f9f848faSopenharmony_ci			while(x < xe);
465f9f848faSopenharmony_ci		if ((*x1 = z) !=0)
466f9f848faSopenharmony_ci			++n1;
467f9f848faSopenharmony_ci#else
468f9f848faSopenharmony_ci		k1 = 16 - k;
469f9f848faSopenharmony_ci		z = 0;
470f9f848faSopenharmony_ci		do {
471f9f848faSopenharmony_ci			*x1++ = *x << k  & 0xffff | z;
472f9f848faSopenharmony_ci			z = *x++ >> k1;
473f9f848faSopenharmony_ci			}
474f9f848faSopenharmony_ci			while(x < xe);
475f9f848faSopenharmony_ci		if (*x1 = z)
476f9f848faSopenharmony_ci			++n1;
477f9f848faSopenharmony_ci#endif
478f9f848faSopenharmony_ci		}
479f9f848faSopenharmony_ci	else do
480f9f848faSopenharmony_ci		*x1++ = *x++;
481f9f848faSopenharmony_ci		while(x < xe);
482f9f848faSopenharmony_ci	b1->wds = n1 - 1;
483f9f848faSopenharmony_ci	Bfree(b);
484f9f848faSopenharmony_ci	return b1;
485f9f848faSopenharmony_ci	}
486f9f848faSopenharmony_ci
487f9f848faSopenharmony_ci int
488f9f848faSopenharmony_cicmp
489f9f848faSopenharmony_ci#ifdef KR_headers
490f9f848faSopenharmony_ci	(a, b) Bigint *a, *b;
491f9f848faSopenharmony_ci#else
492f9f848faSopenharmony_ci	(Bigint *a, Bigint *b)
493f9f848faSopenharmony_ci#endif
494f9f848faSopenharmony_ci{
495f9f848faSopenharmony_ci	ULong *xa, *xa0, *xb, *xb0;
496f9f848faSopenharmony_ci	int i, j;
497f9f848faSopenharmony_ci
498f9f848faSopenharmony_ci	i = a->wds;
499f9f848faSopenharmony_ci	j = b->wds;
500f9f848faSopenharmony_ci#ifdef DEBUG
501f9f848faSopenharmony_ci	if (i > 1 && !a->x[i-1])
502f9f848faSopenharmony_ci		Bug("cmp called with a->x[a->wds-1] == 0");
503f9f848faSopenharmony_ci	if (j > 1 && !b->x[j-1])
504f9f848faSopenharmony_ci		Bug("cmp called with b->x[b->wds-1] == 0");
505f9f848faSopenharmony_ci#endif
506f9f848faSopenharmony_ci	if (i -= j)
507f9f848faSopenharmony_ci		return i;
508f9f848faSopenharmony_ci	xa0 = a->x;
509f9f848faSopenharmony_ci	xa = xa0 + j;
510f9f848faSopenharmony_ci	xb0 = b->x;
511f9f848faSopenharmony_ci	xb = xb0 + j;
512f9f848faSopenharmony_ci	for(;;) {
513f9f848faSopenharmony_ci		if (*--xa != *--xb)
514f9f848faSopenharmony_ci			return *xa < *xb ? -1 : 1;
515f9f848faSopenharmony_ci		if (xa <= xa0)
516f9f848faSopenharmony_ci			break;
517f9f848faSopenharmony_ci		}
518f9f848faSopenharmony_ci	return 0;
519f9f848faSopenharmony_ci	}
520f9f848faSopenharmony_ci
521f9f848faSopenharmony_ci Bigint *
522f9f848faSopenharmony_cidiff
523f9f848faSopenharmony_ci#ifdef KR_headers
524f9f848faSopenharmony_ci	(a, b) Bigint *a, *b;
525f9f848faSopenharmony_ci#else
526f9f848faSopenharmony_ci	(Bigint *a, Bigint *b)
527f9f848faSopenharmony_ci#endif
528f9f848faSopenharmony_ci{
529f9f848faSopenharmony_ci	Bigint *c;
530f9f848faSopenharmony_ci	int i, wa, wb;
531f9f848faSopenharmony_ci	ULong *xa, *xae, *xb, *xbe, *xc;
532f9f848faSopenharmony_ci#ifdef ULLong
533f9f848faSopenharmony_ci	ULLong borrow, y;
534f9f848faSopenharmony_ci#else
535f9f848faSopenharmony_ci	ULong borrow, y;
536f9f848faSopenharmony_ci#ifdef Pack_32
537f9f848faSopenharmony_ci	ULong z;
538f9f848faSopenharmony_ci#endif
539f9f848faSopenharmony_ci#endif
540f9f848faSopenharmony_ci
541f9f848faSopenharmony_ci	i = cmp(a,b);
542f9f848faSopenharmony_ci	if (!i) {
543f9f848faSopenharmony_ci		c = Balloc(0);
544f9f848faSopenharmony_ci		c->wds = 1;
545f9f848faSopenharmony_ci		c->x[0] = 0;
546f9f848faSopenharmony_ci		return c;
547f9f848faSopenharmony_ci		}
548f9f848faSopenharmony_ci	if (i < 0) {
549f9f848faSopenharmony_ci		c = a;
550f9f848faSopenharmony_ci		a = b;
551f9f848faSopenharmony_ci		b = c;
552f9f848faSopenharmony_ci		i = 1;
553f9f848faSopenharmony_ci		}
554f9f848faSopenharmony_ci	else
555f9f848faSopenharmony_ci		i = 0;
556f9f848faSopenharmony_ci	c = Balloc(a->k);
557f9f848faSopenharmony_ci	c->sign = i;
558f9f848faSopenharmony_ci	wa = a->wds;
559f9f848faSopenharmony_ci	xa = a->x;
560f9f848faSopenharmony_ci	xae = xa + wa;
561f9f848faSopenharmony_ci	wb = b->wds;
562f9f848faSopenharmony_ci	xb = b->x;
563f9f848faSopenharmony_ci	xbe = xb + wb;
564f9f848faSopenharmony_ci	xc = c->x;
565f9f848faSopenharmony_ci	borrow = 0;
566f9f848faSopenharmony_ci#ifdef ULLong
567f9f848faSopenharmony_ci	do {
568f9f848faSopenharmony_ci		y = (ULLong)*xa++ - *xb++ - borrow;
569f9f848faSopenharmony_ci		borrow = y >> 32 & 1UL;
570f9f848faSopenharmony_ci		*xc++ = y & 0xffffffffUL;
571f9f848faSopenharmony_ci		}
572f9f848faSopenharmony_ci		while(xb < xbe);
573f9f848faSopenharmony_ci	while(xa < xae) {
574f9f848faSopenharmony_ci		y = *xa++ - borrow;
575f9f848faSopenharmony_ci		borrow = y >> 32 & 1UL;
576f9f848faSopenharmony_ci		*xc++ = y & 0xffffffffUL;
577f9f848faSopenharmony_ci		}
578f9f848faSopenharmony_ci#else
579f9f848faSopenharmony_ci#ifdef Pack_32
580f9f848faSopenharmony_ci	do {
581f9f848faSopenharmony_ci		y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
582f9f848faSopenharmony_ci		borrow = (y & 0x10000) >> 16;
583f9f848faSopenharmony_ci		z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
584f9f848faSopenharmony_ci		borrow = (z & 0x10000) >> 16;
585f9f848faSopenharmony_ci		Storeinc(xc, z, y);
586f9f848faSopenharmony_ci		}
587f9f848faSopenharmony_ci		while(xb < xbe);
588f9f848faSopenharmony_ci	while(xa < xae) {
589f9f848faSopenharmony_ci		y = (*xa & 0xffff) - borrow;
590f9f848faSopenharmony_ci		borrow = (y & 0x10000) >> 16;
591f9f848faSopenharmony_ci		z = (*xa++ >> 16) - borrow;
592f9f848faSopenharmony_ci		borrow = (z & 0x10000) >> 16;
593f9f848faSopenharmony_ci		Storeinc(xc, z, y);
594f9f848faSopenharmony_ci		}
595f9f848faSopenharmony_ci#else
596f9f848faSopenharmony_ci	do {
597f9f848faSopenharmony_ci		y = *xa++ - *xb++ - borrow;
598f9f848faSopenharmony_ci		borrow = (y & 0x10000) >> 16;
599f9f848faSopenharmony_ci		*xc++ = y & 0xffff;
600f9f848faSopenharmony_ci		}
601f9f848faSopenharmony_ci		while(xb < xbe);
602f9f848faSopenharmony_ci	while(xa < xae) {
603f9f848faSopenharmony_ci		y = *xa++ - borrow;
604f9f848faSopenharmony_ci		borrow = (y & 0x10000) >> 16;
605f9f848faSopenharmony_ci		*xc++ = y & 0xffff;
606f9f848faSopenharmony_ci		}
607f9f848faSopenharmony_ci#endif
608f9f848faSopenharmony_ci#endif
609f9f848faSopenharmony_ci	while(!*--xc)
610f9f848faSopenharmony_ci		wa--;
611f9f848faSopenharmony_ci	c->wds = wa;
612f9f848faSopenharmony_ci	return c;
613f9f848faSopenharmony_ci	}
614f9f848faSopenharmony_ci
615f9f848faSopenharmony_ci double
616f9f848faSopenharmony_cib2d
617f9f848faSopenharmony_ci#ifdef KR_headers
618f9f848faSopenharmony_ci	(a, e) Bigint *a; int *e;
619f9f848faSopenharmony_ci#else
620f9f848faSopenharmony_ci	(Bigint *a, int *e)
621f9f848faSopenharmony_ci#endif
622f9f848faSopenharmony_ci{
623f9f848faSopenharmony_ci	ULong *xa, *xa0, w, y, z;
624f9f848faSopenharmony_ci	int k;
625f9f848faSopenharmony_ci	U d;
626f9f848faSopenharmony_ci#ifdef VAX
627f9f848faSopenharmony_ci	ULong d0, d1;
628f9f848faSopenharmony_ci#else
629f9f848faSopenharmony_ci#define d0 word0(&d)
630f9f848faSopenharmony_ci#define d1 word1(&d)
631f9f848faSopenharmony_ci#endif
632f9f848faSopenharmony_ci
633f9f848faSopenharmony_ci	xa0 = a->x;
634f9f848faSopenharmony_ci	xa = xa0 + a->wds;
635f9f848faSopenharmony_ci	y = *--xa;
636f9f848faSopenharmony_ci#ifdef DEBUG
637f9f848faSopenharmony_ci	if (!y) Bug("zero y in b2d");
638f9f848faSopenharmony_ci#endif
639f9f848faSopenharmony_ci	k = hi0bits(y);
640f9f848faSopenharmony_ci	*e = 32 - k;
641f9f848faSopenharmony_ci#ifdef Pack_32
642f9f848faSopenharmony_ci	if (k < Ebits) {
643f9f848faSopenharmony_ci		d0 = Exp_1 | y >> (Ebits - k);
644f9f848faSopenharmony_ci		w = xa > xa0 ? *--xa : 0;
645f9f848faSopenharmony_ci		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
646f9f848faSopenharmony_ci		goto ret_d;
647f9f848faSopenharmony_ci		}
648f9f848faSopenharmony_ci	z = xa > xa0 ? *--xa : 0;
649f9f848faSopenharmony_ci	if (k -= Ebits) {
650f9f848faSopenharmony_ci		d0 = Exp_1 | y << k | z >> (32 - k);
651f9f848faSopenharmony_ci		y = xa > xa0 ? *--xa : 0;
652f9f848faSopenharmony_ci		d1 = z << k | y >> (32 - k);
653f9f848faSopenharmony_ci		}
654f9f848faSopenharmony_ci	else {
655f9f848faSopenharmony_ci		d0 = Exp_1 | y;
656f9f848faSopenharmony_ci		d1 = z;
657f9f848faSopenharmony_ci		}
658f9f848faSopenharmony_ci#else
659f9f848faSopenharmony_ci	if (k < Ebits + 16) {
660f9f848faSopenharmony_ci		z = xa > xa0 ? *--xa : 0;
661f9f848faSopenharmony_ci		d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
662f9f848faSopenharmony_ci		w = xa > xa0 ? *--xa : 0;
663f9f848faSopenharmony_ci		y = xa > xa0 ? *--xa : 0;
664f9f848faSopenharmony_ci		d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
665f9f848faSopenharmony_ci		goto ret_d;
666f9f848faSopenharmony_ci		}
667f9f848faSopenharmony_ci	z = xa > xa0 ? *--xa : 0;
668f9f848faSopenharmony_ci	w = xa > xa0 ? *--xa : 0;
669f9f848faSopenharmony_ci	k -= Ebits + 16;
670f9f848faSopenharmony_ci	d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
671f9f848faSopenharmony_ci	y = xa > xa0 ? *--xa : 0;
672f9f848faSopenharmony_ci	d1 = w << k + 16 | y << k;
673f9f848faSopenharmony_ci#endif
674f9f848faSopenharmony_ci ret_d:
675f9f848faSopenharmony_ci#ifdef VAX
676f9f848faSopenharmony_ci	word0(&d) = d0 >> 16 | d0 << 16;
677f9f848faSopenharmony_ci	word1(&d) = d1 >> 16 | d1 << 16;
678f9f848faSopenharmony_ci#endif
679f9f848faSopenharmony_ci	return dval(&d);
680f9f848faSopenharmony_ci	}
681f9f848faSopenharmony_ci#undef d0
682f9f848faSopenharmony_ci#undef d1
683f9f848faSopenharmony_ci
684f9f848faSopenharmony_ci Bigint *
685f9f848faSopenharmony_cid2b
686f9f848faSopenharmony_ci#ifdef KR_headers
687f9f848faSopenharmony_ci	(dd, e, bits) double dd; int *e, *bits;
688f9f848faSopenharmony_ci#else
689f9f848faSopenharmony_ci	(double dd, int *e, int *bits)
690f9f848faSopenharmony_ci#endif
691f9f848faSopenharmony_ci{
692f9f848faSopenharmony_ci	Bigint *b;
693f9f848faSopenharmony_ci	U d;
694f9f848faSopenharmony_ci#ifndef Sudden_Underflow
695f9f848faSopenharmony_ci	int i;
696f9f848faSopenharmony_ci#endif
697f9f848faSopenharmony_ci	int de, k;
698f9f848faSopenharmony_ci	ULong *x, y, z;
699f9f848faSopenharmony_ci#ifdef VAX
700f9f848faSopenharmony_ci	ULong d0, d1;
701f9f848faSopenharmony_ci#else
702f9f848faSopenharmony_ci#define d0 word0(&d)
703f9f848faSopenharmony_ci#define d1 word1(&d)
704f9f848faSopenharmony_ci#endif
705f9f848faSopenharmony_ci	d.d = dd;
706f9f848faSopenharmony_ci#ifdef VAX
707f9f848faSopenharmony_ci	d0 = word0(&d) >> 16 | word0(&d) << 16;
708f9f848faSopenharmony_ci	d1 = word1(&d) >> 16 | word1(&d) << 16;
709f9f848faSopenharmony_ci#endif
710f9f848faSopenharmony_ci
711f9f848faSopenharmony_ci#ifdef Pack_32
712f9f848faSopenharmony_ci	b = Balloc(1);
713f9f848faSopenharmony_ci#else
714f9f848faSopenharmony_ci	b = Balloc(2);
715f9f848faSopenharmony_ci#endif
716f9f848faSopenharmony_ci	x = b->x;
717f9f848faSopenharmony_ci
718f9f848faSopenharmony_ci	z = d0 & Frac_mask;
719f9f848faSopenharmony_ci	d0 &= 0x7fffffff;	/* clear sign bit, which we ignore */
720f9f848faSopenharmony_ci#ifdef Sudden_Underflow
721f9f848faSopenharmony_ci	de = (int)(d0 >> Exp_shift);
722f9f848faSopenharmony_ci#ifndef IBM
723f9f848faSopenharmony_ci	z |= Exp_msk11;
724f9f848faSopenharmony_ci#endif
725f9f848faSopenharmony_ci#else
726f9f848faSopenharmony_ci	if ( (de = (int)(d0 >> Exp_shift)) !=0)
727f9f848faSopenharmony_ci		z |= Exp_msk1;
728f9f848faSopenharmony_ci#endif
729f9f848faSopenharmony_ci#ifdef Pack_32
730f9f848faSopenharmony_ci	if ( (y = d1) !=0) {
731f9f848faSopenharmony_ci		if ( (k = lo0bits(&y)) !=0) {
732f9f848faSopenharmony_ci			x[0] = y | z << (32 - k);
733f9f848faSopenharmony_ci			z >>= k;
734f9f848faSopenharmony_ci			}
735f9f848faSopenharmony_ci		else
736f9f848faSopenharmony_ci			x[0] = y;
737f9f848faSopenharmony_ci#ifndef Sudden_Underflow
738f9f848faSopenharmony_ci		i =
739f9f848faSopenharmony_ci#endif
740f9f848faSopenharmony_ci		     b->wds = (x[1] = z) !=0 ? 2 : 1;
741f9f848faSopenharmony_ci		}
742f9f848faSopenharmony_ci	else {
743f9f848faSopenharmony_ci		k = lo0bits(&z);
744f9f848faSopenharmony_ci		x[0] = z;
745f9f848faSopenharmony_ci#ifndef Sudden_Underflow
746f9f848faSopenharmony_ci		i =
747f9f848faSopenharmony_ci#endif
748f9f848faSopenharmony_ci		    b->wds = 1;
749f9f848faSopenharmony_ci		k += 32;
750f9f848faSopenharmony_ci		}
751f9f848faSopenharmony_ci#else
752f9f848faSopenharmony_ci	if ( (y = d1) !=0) {
753f9f848faSopenharmony_ci		if ( (k = lo0bits(&y)) !=0)
754f9f848faSopenharmony_ci			if (k >= 16) {
755f9f848faSopenharmony_ci				x[0] = y | z << 32 - k & 0xffff;
756f9f848faSopenharmony_ci				x[1] = z >> k - 16 & 0xffff;
757f9f848faSopenharmony_ci				x[2] = z >> k;
758f9f848faSopenharmony_ci				i = 2;
759f9f848faSopenharmony_ci				}
760f9f848faSopenharmony_ci			else {
761f9f848faSopenharmony_ci				x[0] = y & 0xffff;
762f9f848faSopenharmony_ci				x[1] = y >> 16 | z << 16 - k & 0xffff;
763f9f848faSopenharmony_ci				x[2] = z >> k & 0xffff;
764f9f848faSopenharmony_ci				x[3] = z >> k+16;
765f9f848faSopenharmony_ci				i = 3;
766f9f848faSopenharmony_ci				}
767f9f848faSopenharmony_ci		else {
768f9f848faSopenharmony_ci			x[0] = y & 0xffff;
769f9f848faSopenharmony_ci			x[1] = y >> 16;
770f9f848faSopenharmony_ci			x[2] = z & 0xffff;
771f9f848faSopenharmony_ci			x[3] = z >> 16;
772f9f848faSopenharmony_ci			i = 3;
773f9f848faSopenharmony_ci			}
774f9f848faSopenharmony_ci		}
775f9f848faSopenharmony_ci	else {
776f9f848faSopenharmony_ci#ifdef DEBUG
777f9f848faSopenharmony_ci		if (!z)
778f9f848faSopenharmony_ci			Bug("Zero passed to d2b");
779f9f848faSopenharmony_ci#endif
780f9f848faSopenharmony_ci		k = lo0bits(&z);
781f9f848faSopenharmony_ci		if (k >= 16) {
782f9f848faSopenharmony_ci			x[0] = z;
783f9f848faSopenharmony_ci			i = 0;
784f9f848faSopenharmony_ci			}
785f9f848faSopenharmony_ci		else {
786f9f848faSopenharmony_ci			x[0] = z & 0xffff;
787f9f848faSopenharmony_ci			x[1] = z >> 16;
788f9f848faSopenharmony_ci			i = 1;
789f9f848faSopenharmony_ci			}
790f9f848faSopenharmony_ci		k += 32;
791f9f848faSopenharmony_ci		}
792f9f848faSopenharmony_ci	while(!x[i])
793f9f848faSopenharmony_ci		--i;
794f9f848faSopenharmony_ci	b->wds = i + 1;
795f9f848faSopenharmony_ci#endif
796f9f848faSopenharmony_ci#ifndef Sudden_Underflow
797f9f848faSopenharmony_ci	if (de) {
798f9f848faSopenharmony_ci#endif
799f9f848faSopenharmony_ci#ifdef IBM
800f9f848faSopenharmony_ci		*e = (de - Bias - (P-1) << 2) + k;
801f9f848faSopenharmony_ci		*bits = 4*P + 8 - k - hi0bits(word0(&d) & Frac_mask);
802f9f848faSopenharmony_ci#else
803f9f848faSopenharmony_ci		*e = de - Bias - (P-1) + k;
804f9f848faSopenharmony_ci		*bits = P - k;
805f9f848faSopenharmony_ci#endif
806f9f848faSopenharmony_ci#ifndef Sudden_Underflow
807f9f848faSopenharmony_ci		}
808f9f848faSopenharmony_ci	else {
809f9f848faSopenharmony_ci		*e = de - Bias - (P-1) + 1 + k;
810f9f848faSopenharmony_ci#ifdef Pack_32
811f9f848faSopenharmony_ci		*bits = 32*i - hi0bits(x[i-1]);
812f9f848faSopenharmony_ci#else
813f9f848faSopenharmony_ci		*bits = (i+2)*16 - hi0bits(x[i]);
814f9f848faSopenharmony_ci#endif
815f9f848faSopenharmony_ci		}
816f9f848faSopenharmony_ci#endif
817f9f848faSopenharmony_ci	return b;
818f9f848faSopenharmony_ci	}
819f9f848faSopenharmony_ci#undef d0
820f9f848faSopenharmony_ci#undef d1
821f9f848faSopenharmony_ci
822f9f848faSopenharmony_ci CONST double
823f9f848faSopenharmony_ci#ifdef IEEE_Arith
824f9f848faSopenharmony_cibigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
825f9f848faSopenharmony_ciCONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256
826f9f848faSopenharmony_ci		};
827f9f848faSopenharmony_ci#else
828f9f848faSopenharmony_ci#ifdef IBM
829f9f848faSopenharmony_cibigtens[] = { 1e16, 1e32, 1e64 };
830f9f848faSopenharmony_ciCONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };
831f9f848faSopenharmony_ci#else
832f9f848faSopenharmony_cibigtens[] = { 1e16, 1e32 };
833f9f848faSopenharmony_ciCONST double tinytens[] = { 1e-16, 1e-32 };
834f9f848faSopenharmony_ci#endif
835f9f848faSopenharmony_ci#endif
836f9f848faSopenharmony_ci
837f9f848faSopenharmony_ci CONST double
838f9f848faSopenharmony_citens[] = {
839f9f848faSopenharmony_ci		1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
840f9f848faSopenharmony_ci		1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
841f9f848faSopenharmony_ci		1e20, 1e21, 1e22
842f9f848faSopenharmony_ci#ifdef VAX
843f9f848faSopenharmony_ci		, 1e23, 1e24
844f9f848faSopenharmony_ci#endif
845f9f848faSopenharmony_ci		};
846f9f848faSopenharmony_ci
847f9f848faSopenharmony_ci char *
848f9f848faSopenharmony_ci#ifdef KR_headers
849f9f848faSopenharmony_cistrcp_D2A(a, b) char *a; char *b;
850f9f848faSopenharmony_ci#else
851f9f848faSopenharmony_cistrcp_D2A(char *a, CONST char *b)
852f9f848faSopenharmony_ci#endif
853f9f848faSopenharmony_ci{
854f9f848faSopenharmony_ci	while((*a = *b++))
855f9f848faSopenharmony_ci		a++;
856f9f848faSopenharmony_ci	return a;
857f9f848faSopenharmony_ci	}
858f9f848faSopenharmony_ci
859f9f848faSopenharmony_ci#ifdef NO_STRING_H
860f9f848faSopenharmony_ci
861f9f848faSopenharmony_ci Char *
862f9f848faSopenharmony_ci#ifdef KR_headers
863f9f848faSopenharmony_cimemcpy_D2A(a, b, len) Char *a; Char *b; size_t len;
864f9f848faSopenharmony_ci#else
865f9f848faSopenharmony_cimemcpy_D2A(void *a1, void *b1, size_t len)
866f9f848faSopenharmony_ci#endif
867f9f848faSopenharmony_ci{
868f9f848faSopenharmony_ci	char *a = (char*)a1, *ae = a + len;
869f9f848faSopenharmony_ci	char *b = (char*)b1, *a0 = a;
870f9f848faSopenharmony_ci	while(a < ae)
871f9f848faSopenharmony_ci		*a++ = *b++;
872f9f848faSopenharmony_ci	return a0;
873f9f848faSopenharmony_ci	}
874f9f848faSopenharmony_ci
875f9f848faSopenharmony_ci#endif /* NO_STRING_H */
876