Включает ли привязка LLVM OCaml внутреннюю поддержку? - PullRequest
5 голосов
/ 14 мая 2011

Кажется, я не могу найти ссылку на встроенные функции в официальной привязке LLVM OCaml, кроме функции is_intrinsic.

Я создаю бэкэнд, который должен выполнить некоторую целевую генерацию кода (для SSE, AVX и NEON), а встроенные функции являются стандартным путем в C ++ API.

Ответы [ 2 ]

7 голосов
/ 15 мая 2011

Привязка OCaml поддерживает встроенные функции точно так же, как привязка языка C:

В интерфейсе нет специальной поддержки для них (как в полном интерфейсе C ++), но они могут бытьобъявляется extern и вызывается так же, как и любые другие функции.

например:

open Llvm

let () =
  let c = create_context () in

  let f32_t = float_type c in
  let f32x4_t = vector_type f32_t 4 in

  let m = create_module c "test" in

  (* declare void @printv(<4 x float>)
   * nonce extern which forces preservation of vector results *)
  let printv =
   declare_function "printv"
     (function_type (void_type c) [|f32x4_t|]) m in

  (* declare <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float>) nounwind readnone *)
  let sqrtps =
   declare_function "llvm.x86.sse.sqrt.ps"
     (function_type f32x4_t [|f32x4_t|]) m in

  (* define i32 @main() { entry: *)
  let main = define_function "main" (function_type i32_t [| |]) m in
  let at_entry = builder_at_end c (entry_block main) in

  (*%sqrtps = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>)*)
  let cv1234 = const_vector [| const_float f32_t 1.0; const_float f32_t 2.0;
  const_float f32_t 3.0; const_float f32_t 4.0 |] in
  let sqrt = build_call sqrtps [| cv1234 |] "sqrtps" at_entry in

  (* call void printv(sqrtps) *)
  ignore (build_call printv [| sqrt |] "" at_entry);

  (* ret void *)
  ignore (build_ret (const_null i32_t) at_entry);

  (* Print .ll to stderr *)
  dump_module m

производит:

; ModuleID = 'test'

declare void @printv(<4 x float>)

declare <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float>) nounwind readnone

define i32 @main() {
entry:
  %sqrtps = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>)
  call void @printv(<4 x float> %sqrtps)
  ret i32 0
}

, который правильно компилируется в x86, вызывая sqrtps на xmm регистров.

4 голосов
/ 14 мая 2011

Отказ от ответственности: я никогда не использовал LLVM. После быстрого ознакомления с документацией на связывание, похоже, что ответ «нет». Однако имеется встроенная поддержка сборки, которая может соответствовать или не соответствовать вашим потребностям.

Наконец, кажется, что разработчики LLVM признают, что привязка OCaml не завершена: если вы хотите, вы можете добавить некоторые дополнительные функции (если вы не знакомы с OCaml, привязки C на самом деле не самые простые часть, но привязки LLVM полны примера кода, который вы, вероятно, могли бы успешно адаптировать к другим функциям LLVM), а затем предоставьте исправление для него в списке LLVMdev.

...