xref: /openbsd-src/lib/libc/gdtoa/gmisc.c (revision 7b36286a70b46b494e2bca4a889ab49ef62ba86c)
1*7b36286aSmartynas /****************************************************************
2*7b36286aSmartynas 
3*7b36286aSmartynas The author of this software is David M. Gay.
4*7b36286aSmartynas 
5*7b36286aSmartynas Copyright (C) 1998 by Lucent Technologies
6*7b36286aSmartynas All Rights Reserved
7*7b36286aSmartynas 
8*7b36286aSmartynas Permission to use, copy, modify, and distribute this software and
9*7b36286aSmartynas its documentation for any purpose and without fee is hereby
10*7b36286aSmartynas granted, provided that the above copyright notice appear in all
11*7b36286aSmartynas copies and that both that the copyright notice and this
12*7b36286aSmartynas permission notice and warranty disclaimer appear in supporting
13*7b36286aSmartynas documentation, and that the name of Lucent or any of its entities
14*7b36286aSmartynas not be used in advertising or publicity pertaining to
15*7b36286aSmartynas distribution of the software without specific, written prior
16*7b36286aSmartynas permission.
17*7b36286aSmartynas 
18*7b36286aSmartynas LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
19*7b36286aSmartynas INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
20*7b36286aSmartynas IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
21*7b36286aSmartynas SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22*7b36286aSmartynas WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
23*7b36286aSmartynas IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24*7b36286aSmartynas ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
25*7b36286aSmartynas THIS SOFTWARE.
26*7b36286aSmartynas 
27*7b36286aSmartynas ****************************************************************/
28*7b36286aSmartynas 
29*7b36286aSmartynas /* Please send bug reports to David M. Gay (dmg at acm dot org,
30*7b36286aSmartynas  * with " at " changed at "@" and " dot " changed to ".").	*/
31*7b36286aSmartynas 
32*7b36286aSmartynas #include "gdtoaimp.h"
33*7b36286aSmartynas 
34*7b36286aSmartynas  void
35*7b36286aSmartynas #ifdef KR_headers
rshift(b,k)36*7b36286aSmartynas rshift(b, k) Bigint *b; int k;
37*7b36286aSmartynas #else
38*7b36286aSmartynas rshift(Bigint *b, int k)
39*7b36286aSmartynas #endif
40*7b36286aSmartynas {
41*7b36286aSmartynas 	ULong *x, *x1, *xe, y;
42*7b36286aSmartynas 	int n;
43*7b36286aSmartynas 
44*7b36286aSmartynas 	x = x1 = b->x;
45*7b36286aSmartynas 	n = k >> kshift;
46*7b36286aSmartynas 	if (n < b->wds) {
47*7b36286aSmartynas 		xe = x + b->wds;
48*7b36286aSmartynas 		x += n;
49*7b36286aSmartynas 		if (k &= kmask) {
50*7b36286aSmartynas 			n = ULbits - k;
51*7b36286aSmartynas 			y = *x++ >> k;
52*7b36286aSmartynas 			while(x < xe) {
53*7b36286aSmartynas 				*x1++ = (y | (*x << n)) & ALL_ON;
54*7b36286aSmartynas 				y = *x++ >> k;
55*7b36286aSmartynas 				}
56*7b36286aSmartynas 			if ((*x1 = y) !=0)
57*7b36286aSmartynas 				x1++;
58*7b36286aSmartynas 			}
59*7b36286aSmartynas 		else
60*7b36286aSmartynas 			while(x < xe)
61*7b36286aSmartynas 				*x1++ = *x++;
62*7b36286aSmartynas 		}
63*7b36286aSmartynas 	if ((b->wds = x1 - b->x) == 0)
64*7b36286aSmartynas 		b->x[0] = 0;
65*7b36286aSmartynas 	}
66*7b36286aSmartynas 
67*7b36286aSmartynas  int
68*7b36286aSmartynas #ifdef KR_headers
trailz(b)69*7b36286aSmartynas trailz(b) Bigint *b;
70*7b36286aSmartynas #else
71*7b36286aSmartynas trailz(Bigint *b)
72*7b36286aSmartynas #endif
73*7b36286aSmartynas {
74*7b36286aSmartynas 	ULong L, *x, *xe;
75*7b36286aSmartynas 	int n = 0;
76*7b36286aSmartynas 
77*7b36286aSmartynas 	x = b->x;
78*7b36286aSmartynas 	xe = x + b->wds;
79*7b36286aSmartynas 	for(n = 0; x < xe && !*x; x++)
80*7b36286aSmartynas 		n += ULbits;
81*7b36286aSmartynas 	if (x < xe) {
82*7b36286aSmartynas 		L = *x;
83*7b36286aSmartynas 		n += lo0bits(&L);
84*7b36286aSmartynas 		}
85*7b36286aSmartynas 	return n;
86*7b36286aSmartynas 	}
87