view tests/mini/asm9.d @ 1499:df11cdec45a2

Another shot at fixing the issues with (constant) struct literals and their addresses. See DMD2682, #218, #324. The idea is to separate the notion of const from 'this variable can always be replaced with its initializer' in the frontend. To do that, I introduced Declaration::isSameAsInitializer, which is overridden in VarDeclaration to return false for constants that have a struct literal initializer. So {{{ const S s = S(5); void foo() { auto ps = &s; } // is no longer replaced by void foo() { auto ps = &(S(5)); } }}} To make taking the address of a struct constant with a struct-initializer outside of function scope possible, I made sure that AddrExp::optimize doesn't try to run the argument's optimization with WANTinterpret - that'd again replace the constant with a struct literal temporary.
author Christian Kamm <kamm incasoftware de>
date Sun, 14 Jun 2009 19:49:58 +0200
parents 523bf4f166bc
children
line wrap: on
line source

module asm9;

version(X86)            version = DoSome;
else version(X86_64)    version = DoSome;

T add(T, T t)(T a) {
    asm {
        add a, t;
    }
    return a;
}

void main() {
    version (DoSome) {
        assert(add!(ubyte, 20)(10) == 30);
        assert(add!(ushort, 20_000)(10_000) == 30_000);
        assert(add!(uint, 2_000_000)(1_000_000) == 3_000_000);
    }
    version(X86_64) {
        // 64-bit immediates aren't allowed on "ADD", nor are
        // unsigned 32-bit ones, so make the template parameter
        // fit in a 32-bit signed int.
        // These values were chosen so that the lower 32-bits overflow
        // and we can see the upper half of the 64-bit input increment.
        auto result = add!(long, 2_000_000_000)(21_000_000_000);
        assert(result == 23_000_000_000);
    }
}