Есть два способа:
- Вызовите C через FFI и используйте встроенную сборку на стороне C.
- Напишите фрагмент CMM, который вызывает C (без FFI) и использует встроенную сборку.
Оба решения используют встроенную сборку на стороне 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 или Harpy для вызова некоторой сгенерированной сборки.