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?

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.

Thanks

Joseph

Reply via email to