我可以以某种方式在Haskell中使用内联汇编(类似于GCC对C的内容)吗?
我想将我的Haskell代码与参考实现(ASM)进行比较,这似乎是最简单的方法。我想我可以 从C调用Haskell 并使用GCC内联汇编,但我仍然感兴趣,如果我可以反过来做。
(我在Linux / x86上)
我可以以某种方式在Haskell中使用内联汇编(类似于GCC对C的内容)吗?
我想将我的Haskell代码与参考实现(ASM)进行比较,这似乎是最简单的方法。我想我可以 从C调用Haskell 并使用GCC内联汇编,但我仍然感兴趣,如果我可以反过来做。
(我在Linux / x86上)
有两种方法:
两种解决方案都在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
最后: