Andrew Cooke | Contents | Latest | RSS | Twitter | 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

Lepl parser for Python.

Colorless Green.

Photography around Santiago.

SVG experiment.

Professional Portfolio

Calibration of seismometers.

Data access via web services.

Cache rewrite.

Extending OpenSSH.

C-ORM: docs, API.

Last 100 entries

[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; [Link, Bike] Cheap Cycling Jerseys; [Link, Music] Music To Steal 2017; [Link, Future] Simulated Brain Drives Robot; [Link, Computing] Learned Index Structures; Solo Air Equalization; Update: Higher Pressures; Psychology; [Bike] Exercise And Fuel; Continental Race King 2.2; Removing Lowers; Mnesiacs; [Maths, Link] Dividing By Zero; [Book, Review] Ray Monk - Ludwig Wittgenstein: The Duty Of Genius; [Link, Bike, Computing] Evolving Lacing Patterns; [Jam] Strawberry and Orange Jam; [Chile, Privacy] Biometric Check During Mail Delivery; [Link, Chile, Spanish] Article on the Chilean Drought; [Bike] Extended Gear Ratios, Shimano XT M8000 (24/36 Chainring); [Link, Politics, USA] The Future Of American Democracy; Mass Hysteria; [Review, Books, Links] Kazuo Ishiguro - Never Let Me Go; [Link, Books] David Mitchell's Favourite Japanese Fiction; [Link, Bike] Rear Suspension Geometry; [Link, Cycling, Art] Strava Artwork; [Link, Computing] Useful gcc flags; [Link] Voynich Manuscript Decoded; [Bike] Notes on Servicing Suspension Forks; [Links, Computing] Snap, Flatpack, Appimage; [Link, Computing] Oracle is leaving Java (to die); [Link, Politics] Cubans + Ultrasonics; [Book, Link] Laurent Binet; VirtualBox; [Book, Link] No One's Ways; [Link] The Biggest Problem For Cyclists Is Bad Driving; [Computing] Doxygen, Sphinx, Breathe; [Admin] Brokw Recent Permalinks; [Bike, Chile] Buying Bearings in Santiago; [Computing, Opensuse] Upgrading to 42.3; [Link, Physics] First Support for a Physics Theory of Life; [Link, Bike] Peruvian Frame Maker; [Link] Awesome Game Theory Tit-For-Tat Thing; [Food, Review] La Fabbrica - Good Italian Food In Santiago; [Link, Programming] MySQL UTF8 Broken; [Link, Books] Latin American Authors; [Link, Computing] Optimizatin Puzzle; [Link, Books, Politics] Orwell Prize; [Link] What the Hell Is Happening With Qatar?; [Link] Deep Learning + Virtual Tensor Machines; [Link] Scaled Composites: Largest Wingspan Ever; [Link] SCP Foundation; [Bike] Lessons From 2 Leading 2 Trailing; [Link] Veg Restaurants in Santiago; [Link] List of Contemporary Latin American Authors; [Bike] FTHR; [Link] Whoa - NSA Reduces Collection (of US Residents); [Link] Red Bull's Breitbart; [Link] Linux Threads; [Link] Punycode; [Link] Bull / Girl Statues on Wall Street; [Link] Beautiful Chair Video; Update: Lower Pressures; [Link] Neat Python Exceptions; [Link] Fix for Windows 10 to Avoid Ads; [Link] Attacks on ZRTP; [Link] UK Jazz Invasion; [Review] Cuba; [Link] Aricle on Gender Reversal of US Presidential Debate; {OpenSuse] Fix for Network Offline in Updater Applet

© 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