问题 Haskell中的内联汇编


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

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

(我在Linux / x86上)


4206
2018-06-05 22:24


起源

@Don Stewart这个链接坏了 - alternative
注意,如果你要比较Haskell与内联汇编的性能,我首先要看看GHC生成的汇编(例如-O2 -fllvm),使用 GHC核心 工具 - Don Stewart


答案:


有两种方法:

  • 通过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;
}

rdtsc.c:

unsigned long long rdtsc(void)
{    
  return getticks();
}

rdtsc.h:

unsigned long long rdtsc(void);

rdtsc.hs:

foreign import ccall unsafe "rdtsc.h" rdtsc :: IO Word64

最后:

  • 一个稍微不明显的解决方案是使用 LLVM 要么 哈比 包调用一些生成的程序集。

12
2018-06-05 22:36