On 10/3/2013 3:25 PM, Joseph Cassman wrote:
As of DMD 2.063.2 it looks to me like inline assembly language blocks are not
usable in compile-time code. For example, the following code

   void main() {
     enum a = abc();
   }
   ulong abc() {
     asm { mov RAX,1; }
     return 1;
   }

will produce the error "Error: asm statements cannot be interpreted at compile
time".

Are there plans to eventually support the use of asm blocks in CTFE?

No. Simulating a CPU is way, way beyond its charter.


If it were possible then I could use such a function in a static if test. What I
am looking to do is use a function that calls CPUID (etc.) in a static if
statement to determine which code to generate, somewhat like the following.

   bool isAVXPossible() { asm { ... use CPUID, etc. ... } }
   void foo() {
     static if(isAVXPossible()) {
       asm { ... generate AVX version ... }
     else {
       asm { ... generate non AVX version ... }
     }
   }

I cannot use version(D_SIMD) because I need some more specificity in the
versioning. Similarly, version(X86) and version(X86_64) are convenient but I
would like to be more exact. Also, I tried the functionality in core.cpuid but
it also seems only able to execute at run-time. When trying to use it in a
static if statement I get the error "Error: static variable xfeatures cannot be
read at compile time".

Any ideas on how to implement isAVXPossible() and its related functionality
without using a runtime test are appreciated.


But you don't want a compile time test for that! You want a runtime test, as it should depend on what machine the program is running under, which may not at all be the same one it compiled on.

Reply via email to