1 // Inferno utils/cc/bits.c
2 // http://code.google.com/p/inferno-os/source/browse/utils/cc/bits.c
3 //
4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
6 // Portions Copyright © 1997-1999 Vita Nuova Limited
7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
8 // Portions Copyright © 2004,2006 Bruce Ellis
9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
11 // Portions Copyright © 2009 The Go Authors. All rights reserved.
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining a copy
14 // of this software and associated documentation files (the "Software"), to deal
15 // in the Software without restriction, including without limitation the rights
16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 // copies of the Software, and to permit persons to whom the Software is
18 // furnished to do so, subject to the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be included in
21 // all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 // THE SOFTWARE.
30
31 #include "go.h"
32
33 /*
34 Bits
35 bor(Bits a, Bits b)
36 {
37 Bits c;
38 int i;
39
40 for(i=0; i<BITS; i++)
41 c.b[i] = a.b[i] | b.b[i];
42 return c;
43 }
44
45 Bits
46 band(Bits a, Bits b)
47 {
48 Bits c;
49 int i;
50
51 for(i=0; i<BITS; i++)
52 c.b[i] = a.b[i] & b.b[i];
53 return c;
54 }
55
56 Bits
57 bnot(Bits a)
58 {
59 Bits c;
60 int i;
61
62 for(i=0; i<BITS; i++)
63 c.b[i] = ~a.b[i];
64 return c;
65 }
66 */
67
68 int
69 bany(Bits *a)
70 {
71 int i;
72
73 for(i=0; i<BITS; i++)
74 if(a->b[i])
75 return 1;
76 return 0;
77 }
78
79 /*
80 int
81 beq(Bits a, Bits b)
82 {
83 int i;
84
85 for(i=0; i<BITS; i++)
86 if(a.b[i] != b.b[i])
87 return 0;
88 return 1;
89 }
90 */
91
92 int
93 bnum(Bits a)
94 {
95 int i;
96 int32 b;
97
98 for(i=0; i<BITS; i++)
99 if(b = a.b[i])
100 return 32*i + bitno(b);
101 fatal("bad in bnum");
102 return 0;
103 }
104
105 Bits
106 blsh(uint n)
107 {
108 Bits c;
109
110 c = zbits;
111 c.b[n/32] = 1L << (n%32);
112 return c;
113 }
114
115 /*
116 int
117 bset(Bits a, uint n)
118 {
119 if(a.b[n/32] & (1L << (n%32)))
120 return 1;
121 return 0;
122 }
123 */
124
125 int
126 bitno(int32 b)
127 {
128 int i;
129
130 for(i=0; i<32; i++)
131 if(b & (1L<<i))
132 return i;
133 fatal("bad in bitno");
134 return 0;
135 }
136
137 int
138 Qconv(Fmt *fp)
139 {
140 Bits bits;
141 int i, first;
142
143 first = 1;
144 bits = va_arg(fp->args, Bits);
145 while(bany(&bits)) {
146 i = bnum(bits);
147 if(first)
148 first = 0;
149 else
150 fmtprint(fp, " ");
151 if(var[i].sym == S)
152 fmtprint(fp, "$%lld", var[i].offset);
153 else {
154 fmtprint(fp, var[i].sym->name);
155 if(var[i].offset != 0)
156 fmtprint(fp, "%+d", var[i].offset);
157 }
158 bits.b[i/32] &= ~(1L << (i%32));
159 }
160 return 0;
161 }