smisc.c revision 1.1
11.1Skleink/* $NetBSD: smisc.c,v 1.1 2006/01/25 15:18:49 kleink Exp $ */
21.1Skleink
31.1Skleink/****************************************************************
41.1Skleink
51.1SkleinkThe author of this software is David M. Gay.
61.1Skleink
71.1SkleinkCopyright (C) 1998, 1999 by Lucent Technologies
81.1SkleinkAll Rights Reserved
91.1Skleink
101.1SkleinkPermission to use, copy, modify, and distribute this software and
111.1Skleinkits documentation for any purpose and without fee is hereby
121.1Skleinkgranted, provided that the above copyright notice appear in all
131.1Skleinkcopies and that both that the copyright notice and this
141.1Skleinkpermission notice and warranty disclaimer appear in supporting
151.1Skleinkdocumentation, and that the name of Lucent or any of its entities
161.1Skleinknot be used in advertising or publicity pertaining to
171.1Skleinkdistribution of the software without specific, written prior
181.1Skleinkpermission.
191.1Skleink
201.1SkleinkLUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
211.1SkleinkINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
221.1SkleinkIN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
231.1SkleinkSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
241.1SkleinkWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
251.1SkleinkIN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
261.1SkleinkARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
271.1SkleinkTHIS SOFTWARE.
281.1Skleink
291.1Skleink****************************************************************/
301.1Skleink
311.1Skleink/* Please send bug reports to David M. Gay (dmg at acm dot org,
321.1Skleink * with " at " changed at "@" and " dot " changed to ".").	*/
331.1Skleink
341.1Skleink#include "gdtoaimp.h"
351.1Skleink
361.1Skleink Bigint *
371.1Skleinks2b
381.1Skleink#ifdef KR_headers
391.1Skleink	(s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9;
401.1Skleink#else
411.1Skleink	(CONST char *s, int nd0, int nd, ULong y9)
421.1Skleink#endif
431.1Skleink{
441.1Skleink	Bigint *b;
451.1Skleink	int i, k;
461.1Skleink	Long x, y;
471.1Skleink
481.1Skleink	x = (nd + 8) / 9;
491.1Skleink	for(k = 0, y = 1; x > y; y <<= 1, k++) ;
501.1Skleink#ifdef Pack_32
511.1Skleink	b = Balloc(k);
521.1Skleink	b->x[0] = y9;
531.1Skleink	b->wds = 1;
541.1Skleink#else
551.1Skleink	b = Balloc(k+1);
561.1Skleink	b->x[0] = y9 & 0xffff;
571.1Skleink	b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
581.1Skleink#endif
591.1Skleink
601.1Skleink	i = 9;
611.1Skleink	if (9 < nd0) {
621.1Skleink		s += 9;
631.1Skleink		do b = multadd(b, 10, *s++ - '0');
641.1Skleink			while(++i < nd0);
651.1Skleink		s++;
661.1Skleink		}
671.1Skleink	else
681.1Skleink		s += 10;
691.1Skleink	for(; i < nd; i++)
701.1Skleink		b = multadd(b, 10, *s++ - '0');
711.1Skleink	return b;
721.1Skleink	}
731.1Skleink
741.1Skleink double
751.1Skleinkratio
761.1Skleink#ifdef KR_headers
771.1Skleink	(a, b) Bigint *a, *b;
781.1Skleink#else
791.1Skleink	(Bigint *a, Bigint *b)
801.1Skleink#endif
811.1Skleink{
821.1Skleink	double da, db;
831.1Skleink	int k, ka, kb;
841.1Skleink
851.1Skleink	dval(da) = b2d(a, &ka);
861.1Skleink	dval(db) = b2d(b, &kb);
871.1Skleink	k = ka - kb + ULbits*(a->wds - b->wds);
881.1Skleink#ifdef IBM
891.1Skleink	if (k > 0) {
901.1Skleink		word0(da) += (k >> 2)*Exp_msk1;
911.1Skleink		if (k &= 3)
921.1Skleink			dval(da) *= 1 << k;
931.1Skleink		}
941.1Skleink	else {
951.1Skleink		k = -k;
961.1Skleink		word0(db) += (k >> 2)*Exp_msk1;
971.1Skleink		if (k &= 3)
981.1Skleink			dval(db) *= 1 << k;
991.1Skleink		}
1001.1Skleink#else
1011.1Skleink	if (k > 0)
1021.1Skleink		word0(da) += k*Exp_msk1;
1031.1Skleink	else {
1041.1Skleink		k = -k;
1051.1Skleink		word0(db) += k*Exp_msk1;
1061.1Skleink		}
1071.1Skleink#endif
1081.1Skleink	return dval(da) / dval(db);
1091.1Skleink	}
1101.1Skleink
1111.1Skleink#ifdef INFNAN_CHECK
1121.1Skleink
1131.1Skleink int
1141.1Skleinkmatch
1151.1Skleink#ifdef KR_headers
1161.1Skleink	(sp, t) char **sp, *t;
1171.1Skleink#else
1181.1Skleink	(CONST char **sp, char *t)
1191.1Skleink#endif
1201.1Skleink{
1211.1Skleink	int c, d;
1221.1Skleink	CONST char *s = *sp;
1231.1Skleink
1241.1Skleink	while( (d = *t++) !=0) {
1251.1Skleink		if ((c = *++s) >= 'A' && c <= 'Z')
1261.1Skleink			c += 'a' - 'A';
1271.1Skleink		if (c != d)
1281.1Skleink			return 0;
1291.1Skleink		}
1301.1Skleink	*sp = s + 1;
1311.1Skleink	return 1;
1321.1Skleink	}
1331.1Skleink#endif /* INFNAN_CHECK */
1341.1Skleink
1351.1Skleink void
1361.1Skleink#ifdef KR_headers
1371.1Skleinkcopybits(c, n, b) ULong *c; int n; Bigint *b;
1381.1Skleink#else
1391.1Skleinkcopybits(ULong *c, int n, Bigint *b)
1401.1Skleink#endif
1411.1Skleink{
1421.1Skleink	ULong *ce, *x, *xe;
1431.1Skleink#ifdef Pack_16
1441.1Skleink	int nw, nw1;
1451.1Skleink#endif
1461.1Skleink
1471.1Skleink	ce = c + ((n-1) >> kshift) + 1;
1481.1Skleink	x = b->x;
1491.1Skleink#ifdef Pack_32
1501.1Skleink	xe = x + b->wds;
1511.1Skleink	while(x < xe)
1521.1Skleink		*c++ = *x++;
1531.1Skleink#else
1541.1Skleink	nw = b->wds;
1551.1Skleink	nw1 = nw & 1;
1561.1Skleink	for(xe = x + (nw - nw1); x < xe; x += 2)
1571.1Skleink		Storeinc(c, x[1], x[0]);
1581.1Skleink	if (nw1)
1591.1Skleink		*c++ = *x;
1601.1Skleink#endif
1611.1Skleink	while(c < ce)
1621.1Skleink		*c++ = 0;
1631.1Skleink	}
1641.1Skleink
1651.1Skleink ULong
1661.1Skleink#ifdef KR_headers
1671.1Skleinkany_on(b, k) Bigint *b; int k;
1681.1Skleink#else
1691.1Skleinkany_on(Bigint *b, int k)
1701.1Skleink#endif
1711.1Skleink{
1721.1Skleink	int n, nwds;
1731.1Skleink	ULong *x, *x0, x1, x2;
1741.1Skleink
1751.1Skleink	x = b->x;
1761.1Skleink	nwds = b->wds;
1771.1Skleink	n = k >> kshift;
1781.1Skleink	if (n > nwds)
1791.1Skleink		n = nwds;
1801.1Skleink	else if (n < nwds && (k &= kmask)) {
1811.1Skleink		x1 = x2 = x[n];
1821.1Skleink		x1 >>= k;
1831.1Skleink		x1 <<= k;
1841.1Skleink		if (x1 != x2)
1851.1Skleink			return 1;
1861.1Skleink		}
1871.1Skleink	x0 = x;
1881.1Skleink	x += n;
1891.1Skleink	while(x > x0)
1901.1Skleink		if (*--x)
1911.1Skleink			return 1;
1921.1Skleink	return 0;
1931.1Skleink	}
194