| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
November 12, 2011 Asm and CTFE | ||||
|---|---|---|---|---|
| ||||
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
| ||||
November 12, 2011 Re: Asm and CTFE | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bearophile | 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
| |||
November 12, 2011 Re: Asm and CTFE | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Alex Rønne Petersen | Alex Rønne Petersen:
> 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.
Do you remember why the __ctfe is a run-time variable instead of a more right compile-time constant/version? I remember that Walter was not able to define it as a compile-time constant. So I don't know if it is possible to remove the inline assembly identifiers when doing CTFE.
Bye,
bearophile
| |||
November 12, 2011 Re: Asm and CTFE | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 12-11-2011 23:51, bearophile wrote:
> Alex Rønne Petersen:
>
>> 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.
>
> Do you remember why the __ctfe is a run-time variable instead of a more right compile-time constant/version? I remember that Walter was not able to define it as a compile-time constant. So I don't know if it is possible to remove the inline assembly identifiers when doing CTFE.
>
> Bye,
> bearophile
Not sure. But removing version identifiers when entering CTFE should be trivial; see src/mars.c for how they are added.
- Alex
| |||
November 13, 2011 Re: Asm and CTFE | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Alex Rønne Petersen | Alex Rønne Petersen:
> Not sure. But removing version identifiers when entering CTFE should be trivial; see src/mars.c for how they are added.
Thank you for your answers. I have started again this topic (in a bit more general way) in the main D newsgroup. And I think Martin Nowak doesn't agree with you.
Bye,
bearophile
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply