Mercurial > projects > ldc
diff 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 |
line wrap: on
line diff
--- a/tango/lib/common/tango/core/BitManip.d Wed May 07 20:22:42 2008 +0200 +++ b/tango/lib/common/tango/core/BitManip.d Wed May 07 22:01:59 2008 +0200 @@ -171,6 +171,75 @@ */ uint outpl( uint port_address, uint value ); } +else version( LLVMDC ) +{ + // From GDC ... public domain! + + int bsf(uint v) + { + uint m = 1; + uint i; + for (i = 0; i < 32; i++,m<<=1) { + if (v&m) + return i; + } + return i; // supposed to be undefined + } + + int bsr(uint v) + { + uint m = 0x80000000; + uint i; + for (i = 32; i ; i--,m>>>=1) { + if (v&m) + return i-1; + } + return i; // supposed to be undefined + } + + int bt(uint *p, uint bitnum) + { + return (p[bitnum / (uint.sizeof*8)] & (1<<(bitnum & ((uint.sizeof*8)-1)))) ? -1 : 0 ; + } + + int btc(uint *p, uint bitnum) + { + uint * q = p + (bitnum / (uint.sizeof*8)); + uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); + int result = *q & mask; + *q ^= mask; + return result ? -1 : 0; + } + + int btr(uint *p, uint bitnum) + { + uint * q = p + (bitnum / (uint.sizeof*8)); + uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); + int result = *q & mask; + *q &= ~mask; + return result ? -1 : 0; + } + + int bts(uint *p, uint bitnum) + { + uint * q = p + (bitnum / (uint.sizeof*8)); + uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); + int result = *q & mask; + *q |= mask; + return result ? -1 : 0; + } + + pragma(LLVM_internal, "intrinsic", "llvm.bswap.i32") + uint bswap(uint val); + + ubyte inp(uint p) { return 0; } + ushort inpw(uint p) { return 0; } + uint inpl(uint p) { return 0; } + + ubyte outp(uint p, ubyte v) { return v; } + ushort outpw(uint p, ushort v) { return v; } + uint outpl(uint p, uint v) { return v; } +} else { public import std.intrinsic;