Mercurial > projects > ldc
view runtime/internal/ldc/bitmanip.d @ 1351:8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
author | Tomas Lindquist Olsen <tomas.l.olsen gmail com> |
---|---|
date | Thu, 14 May 2009 17:20:17 +0200 |
parents | 5dbc63f83380 |
children |
line wrap: on
line source
/* * D phobos intrinsics for LDC * * From GDC ... public domain! */ module ldc.bitmanip; // Check for the right compiler version(LDC) { // OK } else { static assert(false, "This module is only valid for LDC"); } 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(intrinsic, "llvm.bswap.i32") uint bswap(uint val); ubyte inp(uint p) { throw new Exception("inp intrinsic not yet implemented"); } ushort inpw(uint p) { throw new Exception("inpw intrinsic not yet implemented"); } uint inpl(uint p) { throw new Exception("inpl intrinsic not yet implemented"); } ubyte outp(uint p, ubyte v) { throw new Exception("outp intrinsic not yet implemented"); } ushort outpw(uint p, ushort v) { throw new Exception("outpw intrinsic not yet implemented"); } uint outpl(uint p, uint v) { throw new Exception("outpl intrinsic not yet implemented"); }