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