Haskell中的内联汇编

ako*_*sch 12 compiler-construction assembly haskell inline-assembly ghc

我可以以某种方式在Haskell中使用内联汇编(类似于GCC对C的内容)吗?

我想将我的Haskell代码与参考实现(ASM)进行比较,这似乎是最简单的方法.我想我可以从C调用Haskell并使用GCC内联汇编,但我仍然感兴趣,如果我可以反过来做.

(我在Linux/x86上)

Don*_*art 13

有两种方法:

  • 通过FFI调用C,并在C端使用内联汇编.
  • 编写一个调用C(没有FFI)的CMM片段,并使用内联汇编.

两种解决方案都在C端使用内联汇编.前者是最惯用的.这是一个例子,来自rdtsc包:

cycles.h:

static __inline__ ticks getticks(void)
{
     unsigned int tbl, tbu0, tbu1;

     do {
      __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0));
      __asm__ __volatile__ ("mftb %0" : "=r"(tbl));
      __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1));
     } while (tbu0 != tbu1);

     return (((unsigned long long)tbu0) << 32) | tbl;
}
Run Code Online (Sandbox Code Playgroud)

rdtsc.c:

unsigned long long rdtsc(void)
{    
  return getticks();
}
Run Code Online (Sandbox Code Playgroud)

rdtsc.h:

unsigned long long rdtsc(void);
Run Code Online (Sandbox Code Playgroud)

rdtsc.hs:

foreign import ccall unsafe "rdtsc.h" rdtsc :: IO Word64
Run Code Online (Sandbox Code Playgroud)

最后:

  • 一个稍微不明显的解决方案是使用LLVMHarpy包来调用某些生成的程序集.