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