Встроенная сборка в Хаскеле - PullRequest
12 голосов
/ 06 июня 2011

Могу ли я как-нибудь использовать встроенную сборку в Haskell (аналогично тому, что GCC делает для C)?

Я хочу сравнить мой код на Haskell с эталонной реализацией (ASM), и это кажется наиболее простым способом.Думаю, я мог бы просто вызвать Haskell из C и использовать встроенную сборку GCC, но я все еще заинтересован, могу ли я сделать это наоборот.

(яв Linux / x86)

1 Ответ

13 голосов
/ 06 июня 2011

Есть два способа:

  • Вызовите 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 для вызова некоторой сгенерированной сборки.
...