Haskell 中的内联汇编

问题描述 投票:0回答:1

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

我想将我的 Haskell 代码与参考实现 (ASM) 进行比较,这似乎是最直接的方法。我想我可以从 C 调用 Haskell 并使用 GCC 内联汇编,但我仍然很感兴趣是否可以以相反的方式做到这一点。

(我使用的是 Linux/x86)

haskell assembly ghc inline-assembly
1个回答
14
投票
有两种方法:

    通过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

最后:

© www.soinside.com 2019 - 2024. All rights reserved.