xref: /plan9-contrib/sys/src/cmd/9c/bits.c (revision fbadb1c4d4463e58337ffb1ed396c9caee5d1889)
1*fbadb1c4SDavid du Colombier #include "gc.h"
2*fbadb1c4SDavid du Colombier 
3*fbadb1c4SDavid du Colombier /*
4*fbadb1c4SDavid du Colombier Bits
5*fbadb1c4SDavid du Colombier bor(Bits a, Bits b)
6*fbadb1c4SDavid du Colombier {
7*fbadb1c4SDavid du Colombier 	Bits c;
8*fbadb1c4SDavid du Colombier 	int i;
9*fbadb1c4SDavid du Colombier 
10*fbadb1c4SDavid du Colombier 	for(i=0; i<BITS; i++)
11*fbadb1c4SDavid du Colombier 		c.b[i] = a.b[i] | b.b[i];
12*fbadb1c4SDavid du Colombier 	return c;
13*fbadb1c4SDavid du Colombier }
14*fbadb1c4SDavid du Colombier */
15*fbadb1c4SDavid du Colombier 
16*fbadb1c4SDavid du Colombier /*
17*fbadb1c4SDavid du Colombier Bits
18*fbadb1c4SDavid du Colombier band(Bits a, Bits b)
19*fbadb1c4SDavid du Colombier {
20*fbadb1c4SDavid du Colombier 	Bits c;
21*fbadb1c4SDavid du Colombier 	int i;
22*fbadb1c4SDavid du Colombier 
23*fbadb1c4SDavid du Colombier 	for(i=0; i<BITS; i++)
24*fbadb1c4SDavid du Colombier 		c.b[i] = a.b[i] & b.b[i];
25*fbadb1c4SDavid du Colombier 	return c;
26*fbadb1c4SDavid du Colombier }
27*fbadb1c4SDavid du Colombier */
28*fbadb1c4SDavid du Colombier 
29*fbadb1c4SDavid du Colombier /*
30*fbadb1c4SDavid du Colombier Bits
31*fbadb1c4SDavid du Colombier bnot(Bits a)
32*fbadb1c4SDavid du Colombier {
33*fbadb1c4SDavid du Colombier 	Bits c;
34*fbadb1c4SDavid du Colombier 	int i;
35*fbadb1c4SDavid du Colombier 
36*fbadb1c4SDavid du Colombier 	for(i=0; i<BITS; i++)
37*fbadb1c4SDavid du Colombier 		c.b[i] = ~a.b[i];
38*fbadb1c4SDavid du Colombier 	return c;
39*fbadb1c4SDavid du Colombier }
40*fbadb1c4SDavid du Colombier */
41*fbadb1c4SDavid du Colombier 
42*fbadb1c4SDavid du Colombier int
bany(Bits * a)43*fbadb1c4SDavid du Colombier bany(Bits *a)
44*fbadb1c4SDavid du Colombier {
45*fbadb1c4SDavid du Colombier 	int i;
46*fbadb1c4SDavid du Colombier 
47*fbadb1c4SDavid du Colombier 	for(i=0; i<BITS; i++)
48*fbadb1c4SDavid du Colombier 		if(a->b[i])
49*fbadb1c4SDavid du Colombier 			return 1;
50*fbadb1c4SDavid du Colombier 	return 0;
51*fbadb1c4SDavid du Colombier }
52*fbadb1c4SDavid du Colombier 
53*fbadb1c4SDavid du Colombier /*
54*fbadb1c4SDavid du Colombier int
55*fbadb1c4SDavid du Colombier beq(Bits a, Bits b)
56*fbadb1c4SDavid du Colombier {
57*fbadb1c4SDavid du Colombier 	int i;
58*fbadb1c4SDavid du Colombier 
59*fbadb1c4SDavid du Colombier 	for(i=0; i<BITS; i++)
60*fbadb1c4SDavid du Colombier 		if(a.b[i] != b.b[i])
61*fbadb1c4SDavid du Colombier 			return 0;
62*fbadb1c4SDavid du Colombier 	return 1;
63*fbadb1c4SDavid du Colombier }
64*fbadb1c4SDavid du Colombier */
65*fbadb1c4SDavid du Colombier 
66*fbadb1c4SDavid du Colombier int
bnum(Bits a)67*fbadb1c4SDavid du Colombier bnum(Bits a)
68*fbadb1c4SDavid du Colombier {
69*fbadb1c4SDavid du Colombier 	int i;
70*fbadb1c4SDavid du Colombier 	long b;
71*fbadb1c4SDavid du Colombier 
72*fbadb1c4SDavid du Colombier 	for(i=0; i<BITS; i++)
73*fbadb1c4SDavid du Colombier 		if(b = a.b[i])
74*fbadb1c4SDavid du Colombier 			return 32*i + bitno(b);
75*fbadb1c4SDavid du Colombier 	diag(Z, "bad in bnum");
76*fbadb1c4SDavid du Colombier 	return 0;
77*fbadb1c4SDavid du Colombier }
78*fbadb1c4SDavid du Colombier 
79*fbadb1c4SDavid du Colombier Bits
blsh(unsigned n)80*fbadb1c4SDavid du Colombier blsh(unsigned n)
81*fbadb1c4SDavid du Colombier {
82*fbadb1c4SDavid du Colombier 	Bits c;
83*fbadb1c4SDavid du Colombier 
84*fbadb1c4SDavid du Colombier 	c = zbits;
85*fbadb1c4SDavid du Colombier 	c.b[n/32] = 1L << (n%32);
86*fbadb1c4SDavid du Colombier 	return c;
87*fbadb1c4SDavid du Colombier }
88*fbadb1c4SDavid du Colombier 
89*fbadb1c4SDavid du Colombier /*
90*fbadb1c4SDavid du Colombier int
91*fbadb1c4SDavid du Colombier bset(Bits a, unsigned n)
92*fbadb1c4SDavid du Colombier {
93*fbadb1c4SDavid du Colombier 	int i;
94*fbadb1c4SDavid du Colombier 
95*fbadb1c4SDavid du Colombier 	if(a.b[n/32] & (1L << (n%32)))
96*fbadb1c4SDavid du Colombier 		return 1;
97*fbadb1c4SDavid du Colombier 	return 0;
98*fbadb1c4SDavid du Colombier }
99*fbadb1c4SDavid du Colombier */
100*fbadb1c4SDavid du Colombier 
101*fbadb1c4SDavid du Colombier int
Bconv(va_list * arg,Fconv * fp)102*fbadb1c4SDavid du Colombier Bconv(va_list *arg, Fconv *fp)
103*fbadb1c4SDavid du Colombier {
104*fbadb1c4SDavid du Colombier 	char str[STRINGSZ], ss[STRINGSZ], *s;
105*fbadb1c4SDavid du Colombier 	Bits bits;
106*fbadb1c4SDavid du Colombier 	int i;
107*fbadb1c4SDavid du Colombier 
108*fbadb1c4SDavid du Colombier 	str[0] = 0;
109*fbadb1c4SDavid du Colombier 	bits = va_arg(*arg, Bits);
110*fbadb1c4SDavid du Colombier 	while(bany(&bits)) {
111*fbadb1c4SDavid du Colombier 		i = bnum(bits);
112*fbadb1c4SDavid du Colombier 		if(str[0])
113*fbadb1c4SDavid du Colombier 			strcat(str, " ");
114*fbadb1c4SDavid du Colombier 		if(var[i].sym == S) {
115*fbadb1c4SDavid du Colombier 			sprint(ss, "$%ld", var[i].offset);
116*fbadb1c4SDavid du Colombier 			s = ss;
117*fbadb1c4SDavid du Colombier 		} else
118*fbadb1c4SDavid du Colombier 			s = var[i].sym->name;
119*fbadb1c4SDavid du Colombier 		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
120*fbadb1c4SDavid du Colombier 			break;
121*fbadb1c4SDavid du Colombier 		strcat(str, s);
122*fbadb1c4SDavid du Colombier 		bits.b[i/32] &= ~(1L << (i%32));
123*fbadb1c4SDavid du Colombier 	}
124*fbadb1c4SDavid du Colombier 	strconv(str, fp);
125*fbadb1c4SDavid du Colombier 	return 0;
126*fbadb1c4SDavid du Colombier }
127