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");
}