view tests/mini/asm8.d @ 951:e71c61befd6d

Now that we're using LLVM 2.5, we can stop always running the CFGSimplification pass. The pass was originally added as a workaround for a LLVM 2.4 bug where debug info would reference labels that have been optimized away.
author Christian Kamm <kamm incasoftware de>
date Thu, 12 Feb 2009 18:39:03 +0100
parents 03d7c4aac654
children b2d27ddf8f45
line wrap: on
line source

int foo()
{
    version(X86)
    asm { mov EAX, 42; }
    else static assert(0, "todo");
}

ulong bar()
{
    version(X86)
    asm { mov EDX, 0xAA; mov EAX, 0xFF; }
    else static assert(0, "todo");
}

float onef()
{
    version(X86)
    asm { fld1; }
    else static assert(0, "todo");
}

double oned()
{
    version(X86)
    asm { fld1; }
    else static assert(0, "todo");
}

real oner()
{
    version(X86)
    asm { fld1; }
    else static assert(0, "todo");
}

real two = 2.0;

creal cr()
{
    version(X86)
    asm { fld1; fld two; }
    else static assert(0, "todo");
}

creal cr2()
{
    version(X86)
    asm
    {
        naked;
        fld1;
        fld two;
        ret;
    }
    else static assert(0, "todo");
}

void* vp()
{
    version(X86)
    asm { mov EAX, 0x80; }
    else static assert(0, "todo");
}

int[int] gaa;

int[int] aa()
{
    version(X86)
    asm { mov EAX, gaa; }
    else static assert(0, "todo");
}

Object gobj;

Object ob()
{
    version(X86)
    asm { mov EAX, gobj; }
    else static assert(0, "todo");
}

char[] ghello = "hello world";

char[] str()
{
    version(X86)
    asm { lea ECX, ghello; mov EAX, [ECX]; mov EDX, [ECX+4]; }
    else static assert(0, "todo");
}

char[] delegate() dg()
{
    version(X86)
    asm { mov EAX, gobj; lea EDX, Object.toString; }
    else static assert(0, "todo");
}

void main()
{
    gaa[4] = 5;
    gobj = new Object;
    auto adg = &gobj.toString;

    assert(foo() == 42);
    assert(bar() == 0x000000AA000000FF);
    assert(onef() == 1);
    assert(oned() == 1);
    assert(oner() == 1);
    assert(cr() == 1+2i);
    assert(cr2() == 1+2i);
    assert(vp() == cast(void*)0x80);
    assert(aa() is gaa);
    assert(ob() is gobj);
    assert(str() == "hello world");
    assert(dg()() == "object.Object");
}

extern(C) int printf(char*, ...);