awesome! that gives me something to do for the next few months :o)
thank-you, andrew On Sunday, 22 March 2015 16:13:43 UTC-3, Isaiah wrote: > > (The PAPI thing was related to the perf counters, so not directly relevant > to the inline assembly question. but, see here: > http://icl.cs.utk.edu/projectsdev/papi/) > > The big change is that `Base.llvmcall` is now merged, so you can write > LLVM IR directly. There are two examples in test/llvmcall.jl, and I believe > Simon Byrne has been testing the use of this for some math intrinsics if > you want to google around (or maybe he will see this and comment if so). > > However, the LLVM+JIT combo in the downloadable Julia versions (LLVM 3.3) > does not support inline assembly, so you will need to compile Julia > yourself against LLVM version 3.6 [1]. > > Once that is done, here are some basic examples I cobbled together -- if > you know assembly and LLVM IR better than I do, hopefully it will be easier > for you. > > Add some ints: > > f(x::Int64,y::Int64) = Base.llvmcall("""%3 = add i64 %0, %1 >> ret i64 %3""", >> (Int64), (Int64,Int64), x, y) >> >> julia> f(1,2) >> 3 > > > Read the RTDSC counter: > > f() = Base.llvmcall("""%1 = call i64 asm sideeffect "rdtsc", >> "=A,~{dirflag},~{fpsr},~{flags}"() >> ret i64 %1""", (Int64), ()) > > julia> f() >> 3643079421 > > > > A helpful trick here is to use clang to tell you what the IR should look > like. Write a C file with the inline assembly you want, then compile it > with `clang -emit-llvm -o test.ll test.c`, then try to translate that into > the form expected by Base.llvmcall. > > I should note that llvmcall is not documented yet, so here are the basics > (I guess I should put this in the docs now that I've grok'd it myself...): > > - first arg is the IR string > - second arg is the return type. Note that contrary to ccall, if you want > to return i64 you should use `(Int64)` rather than `(Int64,)` (comma added) > because otherwise the ret type will be interpreted as `<1 x i64>`. > - third arg is the argument types > - then the actual arguments > > Hope that helps to get started. > > [1] Create a file at the base of the source tree called `Make.user` with > contents: > > LLVM_VER = 3.6.0 > > and then proceed with the standard build instructions. > > On Sun, Mar 22, 2015 at 1:04 PM, andrew cooke <[email protected] > <javascript:>> wrote: > >> >> I'm aware of >> https://groups.google.com/forum/#!searchin/julia-users/calling$20assembly/julia-users/fJHZCAJkrgo/VV7ZskAjqzMJ >> >> - I'm wondering if anything has changed in the last few years? Is calling >> C still the best way to call inline assembly? >> >> I ask because for a general library, I am not sure how portable this is. >> How does one bundle C code so that it is compiled on all platforms Julia >> runs on? >> >> Thanks, Andrew >> >> PS That thread refers to "PAPI C's interface[1]", but I can't see what >> [1] refers to, and my attepts at googling for PAPI have been unproductive. >> So any info on that, too, would be appreciated. >> > >
