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