On Thursday, 20 July 2017 at 21:17:45 UTC, Walter Bright wrote:
template Y(alias X)
{
    enum Y =
    [
        //  id   reg  mask   ty
        X!("AH",   4, mAX, TYuchar),
        X!("AL",   0, mAX, TYuchar),
        X!("AX",   8, mAX, TYushort),
        X!("BH",   7, mBX, TYuchar),
        X!("BL",   3, mBX, TYuchar),
        X!("BP",  13,   0, TYushort),
        X!("BX",  11, mBX, TYushort),
        X!("CH",   5, mCX, TYuchar),
        X!("CL",   1, mCX, TYuchar),
        X!("CX",   9, mCX, TYushort),
        X!("DH",   6, mDX, TYuchar),
        X!("DI",  15, mDI, TYushort),
        X!("DL",   2, mDX, TYuchar),
        X!("DX",  10, mDX, TYushort),
        X!("EAX", 16, mAX, TYulong),
        X!("EBP", 21,   0, TYulong),
        X!("EBX", 19, mBX, TYulong),
        X!("ECX", 17, mCX, TYulong),
        X!("EDI", 23, mDI, TYulong),
        X!("EDX", 18, mDX, TYulong),
        X!("ESI", 22, mSI, TYulong),
        X!("ESP", 20,   0, TYulong),
        X!("SI",  14, mSI, TYushort),
        X!("SP",  12,   0, TYushort),
    ];
}

// Table for identifiers

template Xtab(alias A, alias B, alias C, alias D) { enum Xtab = A; }

private __gshared const(char)*[24] pseudotab = Y!Xtab;


// Register number to use in addressing mode

template Xreg(alias A, alias B, alias C, alias D) { enum Xreg = B; }

__gshared ubyte[24] pseudoreg = Y!Xreg;


// Mask to use for registers affected

template Xmask(alias A, alias B, alias C, alias D) { enum Xmask = C; }

__gshared regm_t[24] pseudomask = Y!Xmask;


// Table for type of pseudo register variable

template Xty(alias A, alias B, alias C, alias D) { enum Xty = mTYvolatile | D; }

private __gshared const(tym_t)[24] pseudoty = Y!Xty;

Please tell me this is not going to get into dmd :)
templates are so much more expensive then macros.
(Well, for now :) )

Those templates can and should be replaced by CTFE.

Reply via email to