Asm and CTFE
Alex Rønne Petersen
xtzgzorex at gmail.com
Sat Nov 12 04:53:36 PST 2011
On 12-11-2011 13:33, bearophile wrote:
> This code doesn't compile with the latest DMD 2.057head:
>
> import std.math: poly;
> enum p = poly(2.0, [-2, 3, 5]);
> void main() {}
>
>
> The error:
> ...\dmd2\src\phobos\std\math.d(3752): Error: asm statements cannot be interpreted at compile time
> test.d(2): called from here: poly(2L,[-2L,3L,5L])
>
>
> The code of poly is something like this:
>
>
> real poly(real x, const real[] A) pure {
> version (D_InlineAsm_X86) {
> version (Windows) {
> asm { // assembler by W. Bright
> mov ECX,A[EBP];
> dec ECX;
> lea EDX,[ECX][ECX*8];
> add EDX,ECX;
> add EDX,A+4[EBP];
> fld real ptr [EDX];
> jecxz return_ST;
> fld x[EBP];
> fxch ST(1);
> align 4;
> L2: fmul ST,ST(1);
> fld real ptr -10[EDX];
> sub EDX,10;
> faddp ST(1),ST;
> dec ECX;
> jne L2;
> fxch ST(1);
> fstp ST(0);
> align 4;
> return_ST:;
> }
> } else
> static assert(0);
> } else {
> sizediff_t i = A.length - 1;
> real r = A[i];
> while (--i>= 0) {
> r *= x;
> r += A[i];
> }
> return r;
> }
> }
>
>
> So there is code able to run at compile time, but D_InlineAsm_X86 is set at compile time too, despite CTFE is not able to run assembly code. In Phobos there are other similar cases where not-assembly fallback code is available, but it can't be used by CTFE.
>
> Do you know how to improve this situation, avoiding messy code too?
>
> Bye,
> bearophile
The problem is that DMD defines *all* version identifiers regardless of
whether CTFE is active. I guess it's just a matter of removing the
inline assembly identifiers when doing CTFE.
- Alex
More information about the Digitalmars-d-learn
mailing list