comparison tango/lib/common/tango/core/BitManip.d @ 184:f5ca6bbbf1d7 trunk

[svn r200] Fixed: removed use of std.intrinsic. Fixed: module info could potentially be masked by a previous reference, resulting in linking failure.
author lindquist
date Wed, 07 May 2008 22:01:59 +0200
parents 1700239cab2e
children
comparison
equal deleted inserted replaced
183:3cdf4b0c75a1 184:f5ca6bbbf1d7
169 /** 169 /**
170 * ditto 170 * ditto
171 */ 171 */
172 uint outpl( uint port_address, uint value ); 172 uint outpl( uint port_address, uint value );
173 } 173 }
174 else version( LLVMDC )
175 {
176 // From GDC ... public domain!
177
178 int bsf(uint v)
179 {
180 uint m = 1;
181 uint i;
182 for (i = 0; i < 32; i++,m<<=1) {
183 if (v&m)
184 return i;
185 }
186 return i; // supposed to be undefined
187 }
188
189 int bsr(uint v)
190 {
191 uint m = 0x80000000;
192 uint i;
193 for (i = 32; i ; i--,m>>>=1) {
194 if (v&m)
195 return i-1;
196 }
197 return i; // supposed to be undefined
198 }
199
200 int bt(uint *p, uint bitnum)
201 {
202 return (p[bitnum / (uint.sizeof*8)] & (1<<(bitnum & ((uint.sizeof*8)-1)))) ? -1 : 0 ;
203 }
204
205 int btc(uint *p, uint bitnum)
206 {
207 uint * q = p + (bitnum / (uint.sizeof*8));
208 uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1));
209 int result = *q & mask;
210 *q ^= mask;
211 return result ? -1 : 0;
212 }
213
214 int btr(uint *p, uint bitnum)
215 {
216 uint * q = p + (bitnum / (uint.sizeof*8));
217 uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1));
218 int result = *q & mask;
219 *q &= ~mask;
220 return result ? -1 : 0;
221 }
222
223 int bts(uint *p, uint bitnum)
224 {
225 uint * q = p + (bitnum / (uint.sizeof*8));
226 uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1));
227 int result = *q & mask;
228 *q |= mask;
229 return result ? -1 : 0;
230 }
231
232 pragma(LLVM_internal, "intrinsic", "llvm.bswap.i32")
233 uint bswap(uint val);
234
235 ubyte inp(uint p) { return 0; }
236 ushort inpw(uint p) { return 0; }
237 uint inpl(uint p) { return 0; }
238
239 ubyte outp(uint p, ubyte v) { return v; }
240 ushort outpw(uint p, ushort v) { return v; }
241 uint outpl(uint p, uint v) { return v; }
242 }
174 else 243 else
175 { 244 {
176 public import std.intrinsic; 245 public import std.intrinsic;
177 } 246 }
178 247