Mercurial > projects > ldc
view tests/mini/bitops.d @ 920:545f54041d91
Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Fixed align N; in asm blocks.
Fixed inreg parameter passing on x86 for ref/out params.
Removed support for lazy initialization of function local static variables, I have no idea why I ever implemented this, it's not in the D spec, and DMD doesn't support it :P
Some of the global variable related changes might cause minor regressions, but they should be easily fixable.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 03 Feb 2009 08:54:57 +0100 |
parents | 1bb99290e03a |
children |
line wrap: on
line source
extern(C) int printf(char*, ...); void main() { printf("Bitwise operations test\n"); { ushort a = 0xFFF0; ushort b = 0x0FFF; assert((a&b) == 0x0FF0); assert((a|b) == 0xFFFF); assert((a^b) == 0xF00F); } { ubyte a = 0xFF; ulong b = 0xFFFF_FFFF_FFFF_FFF0; assert((a&b) == 0xF0); } { ushort s = 0xFF; assert((s<<1) == s*2); assert((s>>>1) == s/2); } { int s = -10; assert((s>>1) == -5); assert((s>>>1) != -5); } { ushort a = 0xFFF0; ushort b = 0x0FFF; auto t = a; t &= b; assert(t == 0x0FF0); t = a; t |= b; assert(t == 0xFFFF); t = a; t ^= b; assert(t == 0xF00F); } { ubyte a = 0xFF; ulong b = 0xFFFF_FFFF_FFFF_FFF0; a &= b; assert(a == 0xF0); } { ushort s = 0xFF; auto t = s; t <<= 1; assert(t == (s*2)); t = s; t >>>= 1; assert(t == s/2); } { int s = -10; auto t = s; t >>= 1; assert(t == -5); t = s; t >>>= 1; assert(t != -5); } { struct S { uint i; ulong l; }; S s = S(1,4); auto a = s.i | s.l; assert(a == 5); s.i = 0xFFFF_00FF; s.l = 0xFFFF_FFFF_0000_FF00; s.l ^= s.i; assert(s.l == ulong.max); s.i = 0x__FFFF_FF00; s.l = 0xFF00FF_FF00; s.i &= s.l; assert(s.i == 0x00FF_FF00); } printf(" SUCCESS\n"); }