2011-05-13 9 views
5

Nie mogę znaleźć odniesienia do elementów wewnętrznych w oficjalnym powiązaniu OCLL LLVM, poza funkcją is_intrinsic.Czy powiązanie OCaml LLVM obejmuje wewnętrzne wsparcie?

Buduję backend, który musi wykonać pewne generowanie kodu celowego (dla SSE, AVX i NEON), a wewnętrzne są standardową ścieżką w API C++.

Odpowiedz

7

OCaml wiążące wsporniki intrinsics w dokładnie taki sam sposób, jak w języku C Oprawa:

Nie ma specjalnego wsparcia dla nich w interfejsie (jak jest w interfejsie pełny C++), ale mogą one zostać uznane za extern i nazywany tak jak wszystkie inne funkcje.

np .:

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 

sporządza:

; 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 
} 

które zestawia się x86 prawidłowo powołuje sqrtps w rejestrach xmm.

4

Nota prawna: Nigdy nie korzystałem z LLVM. Po krótkim spojrzeniu na wiążącą dokumentację wygląda na to, że odpowiedź brzmi "nie". Istnieje jednak wsparcie dla montażu w linii, które może, ale nie musi odpowiadać twoim potrzebom.

W końcu wygląda na to, że programista LLVM zaakceptował, że powiązanie OCaml nie jest kompletne: jeśli chcesz, możesz dodać więcej funkcji (jeśli nie znasz OCaml, wiązania C nie są tak naprawdę najłatwiejsza część, ale powiązania LLVM są pełne przykładowego kodu, który prawdopodobnie z powodzeniem mógłby zostać dostosowany do innych funkcji LLVM), a następnie dostarczyć poprawkę dla niego na liście LLVMdev.

Powiązane problemy