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;