2011-05-13 19 views
5

Tôi dường như không thể tìm thấy tham chiếu đến nội tại trong liên kết LLVM OCaml chính thức, ngoài chức năng is_intrinsic.Liên kết LLVM OCaml có bao gồm hỗ trợ nội tại không?

Tôi đang tạo một chương trình phụ trợ cần thực hiện một số mã tạo mã đích cụ thể (cho SSE, AVX và NEON), và nội tại là đường dẫn chuẩn trong API C++.

Trả lời

7

Các OCaml ràng buộc hỗ trợ intrinsics trong cách chính xác giống như ngôn ngữ C ràng buộc:

Không có hỗ trợ đặc biệt cho họ trong giao diện (như có trong đầy đủ C++ giao diện), nhưng họ có thể được khai báo extern và được gọi giống như bất kỳ chức năng nào khác.

ví dụ .:

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 

sản xuất:

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

mà biên dịch vào x86 đúng cách gọi sqrtps trên xmm đăng ký.

4

Tuyên bố từ chối trách nhiệm: Tôi chưa bao giờ sử dụng LLVM. Sau khi xem nhanh tài liệu ràng buộc, có vẻ như câu trả lời là "không". Có một sự hỗ trợ cho lắp ráp nội tuyến tuy nhiên, có thể hoặc có thể không phù hợp với nhu cầu của bạn. Cuối cùng, có vẻ như nó được chấp nhận bởi các nhà phát triển LLVM rằng ràng buộc OCaml là không hoàn thành: nếu bạn muốn, bạn có thể thêm một số chức năng hơn (nếu bạn không quen thuộc với OCaml, C bindings thực sự không phải là phần dễ nhất, nhưng các ràng buộc LLVM có đầy đủ mã ví dụ mà bạn có thể thích ứng thành công với các hàm LLVM khác), sau đó cung cấp một bản vá cho nó trên danh sách LLVMdev.

Các vấn đề liên quan