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