Excellent! Thanks guys, this is a TON better! I find it a little bit strange that it fetches the value of 0 from some area in memory instead of just say xor RAX, RAX. I'm guessing it doesn't know that the value is actually numeric 0? Is that because zero(T) isn't being inlined fully perhaps?
If it could realize that zero(T) is actually 0, it would probably avoid the add altogether and simply do a mov into RAX. Interestingly, the code generated for Uints implies that that it knows that zero(T) is actually just 0 and we get: julia> code_native(f, (Uint,)) .section __TEXT,__text,regular,pure_instructions Filename: none Source line: 3 push RBP mov RBP, RSP test RDI, RDI je 9 Source line: 3 imul RDI, RDI jmpq 2 xor EDI, EDI Source line: 6 mov RAX, RDI pop RBP ret Which is a little strange in its own way, since the xor EDI, EDI is unecessary (and the jmpq 2 as well), but is at least better in that it doesn't load a 0 from memory. Any clues? Thanks for your help guys, Rak. On Thursday, April 3, 2014 5:24:27 PM UTC-4, Matt Bauman wrote: > > Talk about a perfect storm of fixes and enhancements! With the latest > commit by Arch Robison, the native code is remarkably similar to clang's > output — just load, test, and multiply and add. It's funny to read folks > in the issue talking about how much faster the 0.3 version is… when the > final result ended up being something like > 50 million fold faster than > 0.2. So very impressive. > > You should complain about strange LLVM code more often, Rak. Here's the > native code now: > > julia> code_native(f, (Int,)) > .section __TEXT,__text,regular,pure_instructions > Filename: none > Source line: 2 > push RBP > mov RBP, RSP > movabs RAX, 140508429342280 > Source line: 2 > mov RAX, QWORD PTR [RAX] > test RDI, RDI > jle 7 > Source line: 3 > imul RDI, RDI > add RAX, RDI > Source line: 6 > pop RBP > ret > > On Wednesday, April 2, 2014 9:26:44 PM UTC-4, andrew cooke wrote: >> >> >> thanks! it's just possible this will fix a performance issue of mine :o) >> >> On Wednesday, 2 April 2014 16:57:36 UTC-3, Steven G. Johnson wrote: >>> >>> Just filed this as an issue: >>> https://github.com/JuliaLang/julia/issues/6382 >>> >> julia> code_native(f, (Uint,)) .section __TEXT,__text,regular,pure_instructions Filename: none Source line: 3 push RBP mov RBP, RSP test RDI, RDI je 9 Source line: 3 imul RDI, RDI jmpq 2 xor EDI, EDI Source line: 6 mov RAX, RDI pop RBP ret