The X Macro using D
Stefan Koch via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jul 20 14:21:48 PDT 2017
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.
More information about the Digitalmars-d
mailing list