Andrew Cooke | Contents | Latest | RSS | Previous | Next

C[omp]ute

Welcome to my blog, which was once a mailing list of the same name and is still generated by mail. Please reply via the "comment" links.

Always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Python web; Java enterprise; functional languages; GPGPU; SQL databases; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Personal Projects

Choochoo Training Diary

Last 100 entries

Surprise Paradox; [Books] Good Author List; [Computing] Efficient queries with grouping in Postgres; [Computing] Automatic Wake (Linux); [Computing] AWS CDK Aspects in Go; [Bike] Adidas Gravel Shoes; [Computing, Horror] Biological Chips; [Books] Weird Lit Recs; [Covid] Extended SIR Models; [Art] York-based Printmaker; [Physics] Quantum Transitions are not Instantaneous; [Computing] AI and Drum Machines; [Computing] Probabilities, Stopping Times, Martingales; bpftrace Intro Article; [Computing] Starlab Systems - Linux Laptops; [Computing] Extended Berkeley Packet Filter; [Green] Mainspring Linear Generator; Better Approach; Rummikub Solver; Chilean Poetry; Felicitations - Empowerment Grant; [Bike] Fixing Spyre Brakes (That Need Constant Adjustment); [Computing, Music] Raspberry Pi Media (Audio) Streamer; [Computing] Amazing Hack To Embed DSL In Python; [Bike] Ruta Del Condor (El Alfalfal); [Bike] Estimating Power On Climbs; [Computing] Applying Azure B2C Authentication To Function Apps; [Bike] Gearing On The Back Of An Envelope; [Computing] Okular and Postscript in OpenSuse; There's a fix!; [Computing] Fail2Ban on OpenSuse Leap 15.3 (NFTables); [Cycling, Computing] Power Calculation and Brakes; [Hardware, Computing] Amazing Pockit Computer; Bullying; How I Am - 3 Years Post Accident, 8+ Years With MS; [USA Politics] In America's Uncivil War Republicans Are The Aggressors; [Programming] Selenium and Python; Better Walking Data; [Bike] How Fast Before Walking More Efficient Than Cycling?; [COVID] Coronavirus And Cycling; [Programming] Docker on OpenSuse; Cadence v Speed; [Bike] Gearing For Real Cyclists; [Programming] React plotting - visx; [Programming] React Leaflet; AliExpress Independent Sellers; Applebaum - Twilight of Democracy; [Politics] Back + US Elections; [Programming,Exercise] Simple Timer Script; [News] 2019: The year revolt went global; [Politics] The world's most-surveilled cities; [Bike] Hope Freehub; [Restaurant] Mama Chau's (Chinese, Providencia); [Politics] Brexit Podcast; [Diary] Pneumonia; [Politics] Britain's Reichstag Fire moment; install cairo; [Programming] GCC Sanitizer Flags; [GPU, Programming] Per-Thread Program Counters; My Bike Accident - Looking Back One Year; [Python] Geographic heights are incredibly easy!; [Cooking] Cookie Recipe; Efficient, Simple, Directed Maximisation of Noisy Function; And for argparse; Bash Completion in Python; [Computing] Configuring Github Jekyll Locally; [Maths, Link] The Napkin Project; You can Masquerade in Firewalld; [Bike] Servicing Budget (Spring) Forks; [Crypto] CIA Internet Comms Failure; [Python] Cute Rate Limiting API; [Causality] Judea Pearl Lecture; [Security, Computing] Chinese Hardware Hack Of Supermicro Boards; SQLAlchemy Joined Table Inheritance and Delete Cascade; [Translation] The Club; [Computing] Super Potato Bruh; [Computing] Extending Jupyter; Further HRM Details; [Computing, Bike] Activities in ch2; [Books, Link] Modern Japanese Lit; What ended up there; [Link, Book] Logic Book; Update - Garmin Express / Connect; Garmin Forerunner 35 v 230; [Link, Politics, Internet] Government Trolls; [Link, Politics] Why identity politics benefits the right more than the left; SSH Forwarding; A Specification For Repeating Events; A Fight for the Soul of Science; [Science, Book, Link] Lost In Math; OpenSuse Leap 15 Network Fixes; Update; [Book] Galileo's Middle Finger; [Bike] Chinese Carbon Rims; [Bike] Servicing Shimano XT Front Hub HB-M8010; [Bike] Aliexpress Cycling Tops; [Computing] Change to ssh handling of multiple identities?; [Bike] Endura Hummvee Lite II; [Computing] Marble Based Logic; [Link, Politics] Sanity Check For Nuclear Launch; [Link, Science] Entropy and Life

© 2006-2017 Andrew Cooke (site) / post authors (content).

Inline Assembly With Julia / LLVM

From: andrew cooke <andrew@...>

Date: Fri, 15 May 2015 11:38:45 -0300

Note that this is LLVM IR assembly, not x64.  But you can access even very
specific instructions, like PCLMULQDQ 
http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20120528/143720.html

First, you need to build Julia from trunk with LLVM 3.6 (instructions from
https://groups.google.com/d/msg/julia-users/PffilD_uaeg/hkQh5U7KE2QJ which
really has everything you need to know - thanks Isiah)

  git clone git://github.com/JuliaLang/julia.git julia-llvm-3.6
  cd julia-llvm-3.6
  echo "LLVM_VER=3.6.0" > Make.user
  make -j 3

You can then check that:

  pushd usr/bin
  ./llc -version
  popd

Now, test assembly inside julia:

  f(x::Int64,y::Int64) = Base.llvmcall("""
    %3 = add i64 %0, %1
    ret i64 %3""",
    Int64,
    Tuple{Int64, Int64},
    x, y)
  f(1, 2)

which should give 3.

Similarly

  f() = Base.llvmcall("""
    %1 = add i64 1, 2
    ret i64 %1""",
    Int64,
    Tuple{})

(I have no idea why that needs to be %1 rather than %3, but %3 gives an
error).

Trying to get beyond this, I tried to print a string.  But the reference
manual (link below) uses "declare", which llvmcall doesn't seem to like.  And
I can't get literal strings to work (see "array constants" in the manual,
which says c"hello world" should be ok).

For example,

  g() = Base.llvmcall("""
    call i32 (i8*, ...)* @printf(i8* c"hello world\0")
    ret""",
    Void, Tuple{})

gives "error: expected string" right where the string is, while trying to
define it previously, with something like "@s = ..." gives "error: expected
insruction opcode".


So I tried to look at the output from code_llvm, but that's not terribly
helpful either:

julia> function h()
         print("hello world")
       end
h (generic function with 1 method)

julia> code_llvm(h, ())

define %jl_value_t* @julia_h_44607() {
top:
  %0 = alloca [4 x %jl_value_t*], align 8
  %.sub = getelementptr inbounds [4 x %jl_value_t*]* %0, i64 0, i64 0
  %1 = getelementptr [4 x %jl_value_t*]* %0, i64 0, i64 2
  %2 = bitcast [4 x %jl_value_t*]* %0 to i64*
  store i64 4, i64* %2, align 8
  %3 = getelementptr [4 x %jl_value_t*]* %0, i64 0, i64 1
  %4 = bitcast %jl_value_t** %3 to %jl_value_t***
  %5 = load %jl_value_t*** @jl_pgcstack, align 8
  store %jl_value_t** %5, %jl_value_t*** %4, align 8
  store %jl_value_t** %.sub, %jl_value_t*** @jl_pgcstack, align 8
  store %jl_value_t* null, %jl_value_t** %1, align 8
  %6 = getelementptr [4 x %jl_value_t*]* %0, i64 0, i64 3
  store %jl_value_t* null, %jl_value_t** %6, align 8
  %7 = load %jl_value_t** inttoptr (i64 139727723511144 to %jl_value_t**),
  align 8
  %8 = icmp eq %jl_value_t* %7, null
  br i1 %8, label %err, label %ok

err:                                              ; preds = %top
  call void @jl_undefined_var_error(%jl_value_t* inttoptr (i64 139727711444264
  to %jl_value_t*))
  unreachable

ok:                                               ; preds = %top
  store %jl_value_t* %7, %jl_value_t** %1, align 8
  store %jl_value_t* inttoptr (i64 139727767335888 to %jl_value_t*),
  %jl_value_t** %6, align 8
  %9 = call %jl_value_t* @jl_apply_generic(%jl_value_t* inttoptr (i64
  139727730966960 to %jl_value_t*), %jl_value_t** %1, i32 2)
  %10 = load %jl_value_t*** %4, align 8
  store %jl_value_t** %10, %jl_value_t*** @jl_pgcstack, align 8
  ret %jl_value_t* %9
}

Which doesn't help!


Finally, documentation:

  * There's an exmaple involving tuples in test/llvmcall.jl

  * The structure of the call is given in src/ccall.cpp as
    llvmcall(ir, (rettypes...), (argtypes...), args...)

  * The language ref for 3.6 is at
    http://llvm.org/releases/3.6.0/docs/LangRef.html

  * I can't find anything on x86 intrinsics, however.



Andrew

Comment on this post