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 Bigint *
35f9f848faSopenharmony_cis2b
36f9f848faSopenharmony_ci#ifdef KR_headers
37f9f848faSopenharmony_ci	(s, nd0, nd, y9, dplen) CONST char *s; int dplen, nd0, nd; ULong y9;
38f9f848faSopenharmony_ci#else
39f9f848faSopenharmony_ci	(CONST char *s, int nd0, int nd, ULong y9, int dplen)
40f9f848faSopenharmony_ci#endif
41f9f848faSopenharmony_ci{
42f9f848faSopenharmony_ci	Bigint *b;
43f9f848faSopenharmony_ci	int i, k;
44f9f848faSopenharmony_ci	Long x, y;
45f9f848faSopenharmony_ci
46f9f848faSopenharmony_ci	x = (nd + 8) / 9;
47f9f848faSopenharmony_ci	for(k = 0, y = 1; x > y; y <<= 1, k++) ;
48f9f848faSopenharmony_ci#ifdef Pack_32
49f9f848faSopenharmony_ci	b = Balloc(k);
50f9f848faSopenharmony_ci	b->x[0] = y9;
51f9f848faSopenharmony_ci	b->wds = 1;
52f9f848faSopenharmony_ci#else
53f9f848faSopenharmony_ci	b = Balloc(k+1);
54f9f848faSopenharmony_ci	b->x[0] = y9 & 0xffff;
55f9f848faSopenharmony_ci	b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
56f9f848faSopenharmony_ci#endif
57f9f848faSopenharmony_ci
58f9f848faSopenharmony_ci	i = 9;
59f9f848faSopenharmony_ci	if (9 < nd0) {
60f9f848faSopenharmony_ci		s += 9;
61f9f848faSopenharmony_ci		do b = multadd(b, 10, *s++ - '0');
62f9f848faSopenharmony_ci			while(++i < nd0);
63f9f848faSopenharmony_ci		s += dplen;
64f9f848faSopenharmony_ci		}
65f9f848faSopenharmony_ci	else
66f9f848faSopenharmony_ci		s += dplen + 9;
67f9f848faSopenharmony_ci	for(; i < nd; i++)
68f9f848faSopenharmony_ci		b = multadd(b, 10, *s++ - '0');
69f9f848faSopenharmony_ci	return b;
70f9f848faSopenharmony_ci	}
71f9f848faSopenharmony_ci
72f9f848faSopenharmony_ci double
73f9f848faSopenharmony_ciratio
74f9f848faSopenharmony_ci#ifdef KR_headers
75f9f848faSopenharmony_ci	(a, b) Bigint *a, *b;
76f9f848faSopenharmony_ci#else
77f9f848faSopenharmony_ci	(Bigint *a, Bigint *b)
78f9f848faSopenharmony_ci#endif
79f9f848faSopenharmony_ci{
80f9f848faSopenharmony_ci	U da, db;
81f9f848faSopenharmony_ci	int k, ka, kb;
82f9f848faSopenharmony_ci
83f9f848faSopenharmony_ci	dval(&da) = b2d(a, &ka);
84f9f848faSopenharmony_ci	dval(&db) = b2d(b, &kb);
85f9f848faSopenharmony_ci	k = ka - kb + ULbits*(a->wds - b->wds);
86f9f848faSopenharmony_ci#ifdef IBM
87f9f848faSopenharmony_ci	if (k > 0) {
88f9f848faSopenharmony_ci		word0(&da) += (k >> 2)*Exp_msk1;
89f9f848faSopenharmony_ci		if (k &= 3)
90f9f848faSopenharmony_ci			dval(&da) *= 1 << k;
91f9f848faSopenharmony_ci		}
92f9f848faSopenharmony_ci	else {
93f9f848faSopenharmony_ci		k = -k;
94f9f848faSopenharmony_ci		word0(&db) += (k >> 2)*Exp_msk1;
95f9f848faSopenharmony_ci		if (k &= 3)
96f9f848faSopenharmony_ci			dval(&db) *= 1 << k;
97f9f848faSopenharmony_ci		}
98f9f848faSopenharmony_ci#else
99f9f848faSopenharmony_ci	if (k > 0)
100f9f848faSopenharmony_ci		word0(&da) += k*Exp_msk1;
101f9f848faSopenharmony_ci	else {
102f9f848faSopenharmony_ci		k = -k;
103f9f848faSopenharmony_ci		word0(&db) += k*Exp_msk1;
104f9f848faSopenharmony_ci		}
105f9f848faSopenharmony_ci#endif
106f9f848faSopenharmony_ci	return dval(&da) / dval(&db);
107f9f848faSopenharmony_ci	}
108f9f848faSopenharmony_ci
109f9f848faSopenharmony_ci#ifdef INFNAN_CHECK
110f9f848faSopenharmony_ci
111f9f848faSopenharmony_ci int
112f9f848faSopenharmony_cimatch
113f9f848faSopenharmony_ci#ifdef KR_headers
114f9f848faSopenharmony_ci	(sp, t) char **sp, *t;
115f9f848faSopenharmony_ci#else
116f9f848faSopenharmony_ci	(CONST char **sp, char *t)
117f9f848faSopenharmony_ci#endif
118f9f848faSopenharmony_ci{
119f9f848faSopenharmony_ci	int c, d;
120f9f848faSopenharmony_ci	CONST char *s = *sp;
121f9f848faSopenharmony_ci
122f9f848faSopenharmony_ci	while( (d = *t++) !=0) {
123f9f848faSopenharmony_ci		if ((c = *++s) >= 'A' && c <= 'Z')
124f9f848faSopenharmony_ci			c += 'a' - 'A';
125f9f848faSopenharmony_ci		if (c != d)
126f9f848faSopenharmony_ci			return 0;
127f9f848faSopenharmony_ci		}
128f9f848faSopenharmony_ci	*sp = s + 1;
129f9f848faSopenharmony_ci	return 1;
130f9f848faSopenharmony_ci	}
131f9f848faSopenharmony_ci#endif /* INFNAN_CHECK */
132f9f848faSopenharmony_ci
133f9f848faSopenharmony_ci void
134f9f848faSopenharmony_ci#ifdef KR_headers
135f9f848faSopenharmony_cicopybits(c, n, b) ULong *c; int n; Bigint *b;
136f9f848faSopenharmony_ci#else
137f9f848faSopenharmony_cicopybits(ULong *c, int n, Bigint *b)
138f9f848faSopenharmony_ci#endif
139f9f848faSopenharmony_ci{
140f9f848faSopenharmony_ci	ULong *ce, *x, *xe;
141f9f848faSopenharmony_ci#ifdef Pack_16
142f9f848faSopenharmony_ci	int nw, nw1;
143f9f848faSopenharmony_ci#endif
144f9f848faSopenharmony_ci
145f9f848faSopenharmony_ci	ce = c + ((n-1) >> kshift) + 1;
146f9f848faSopenharmony_ci	x = b->x;
147f9f848faSopenharmony_ci#ifdef Pack_32
148f9f848faSopenharmony_ci	xe = x + b->wds;
149f9f848faSopenharmony_ci	while(x < xe)
150f9f848faSopenharmony_ci		*c++ = *x++;
151f9f848faSopenharmony_ci#else
152f9f848faSopenharmony_ci	nw = b->wds;
153f9f848faSopenharmony_ci	nw1 = nw & 1;
154f9f848faSopenharmony_ci	for(xe = x + (nw - nw1); x < xe; x += 2)
155f9f848faSopenharmony_ci		Storeinc(c, x[1], x[0]);
156f9f848faSopenharmony_ci	if (nw1)
157f9f848faSopenharmony_ci		*c++ = *x;
158f9f848faSopenharmony_ci#endif
159f9f848faSopenharmony_ci	while(c < ce)
160f9f848faSopenharmony_ci		*c++ = 0;
161f9f848faSopenharmony_ci	}
162f9f848faSopenharmony_ci
163f9f848faSopenharmony_ci ULong
164f9f848faSopenharmony_ci#ifdef KR_headers
165f9f848faSopenharmony_ciany_on(b, k) Bigint *b; int k;
166f9f848faSopenharmony_ci#else
167f9f848faSopenharmony_ciany_on(Bigint *b, int k)
168f9f848faSopenharmony_ci#endif
169f9f848faSopenharmony_ci{
170f9f848faSopenharmony_ci	int n, nwds;
171f9f848faSopenharmony_ci	ULong *x, *x0, x1, x2;
172f9f848faSopenharmony_ci
173f9f848faSopenharmony_ci	x = b->x;
174f9f848faSopenharmony_ci	nwds = b->wds;
175f9f848faSopenharmony_ci	n = k >> kshift;
176f9f848faSopenharmony_ci	if (n > nwds)
177f9f848faSopenharmony_ci		n = nwds;
178f9f848faSopenharmony_ci	else if (n < nwds && (k &= kmask)) {
179f9f848faSopenharmony_ci		x1 = x2 = x[n];
180f9f848faSopenharmony_ci		x1 >>= k;
181f9f848faSopenharmony_ci		x1 <<= k;
182f9f848faSopenharmony_ci		if (x1 != x2)
183f9f848faSopenharmony_ci			return 1;
184f9f848faSopenharmony_ci		}
185f9f848faSopenharmony_ci	x0 = x;
186f9f848faSopenharmony_ci	x += n;
187f9f848faSopenharmony_ci	while(x > x0)
188f9f848faSopenharmony_ci		if (*--x)
189f9f848faSopenharmony_ci			return 1;
190f9f848faSopenharmony_ci	return 0;
191f9f848faSopenharmony_ci	}
192