4 ms·
I don't know if http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Integer.java?av=f#1444 http://grepcode.com/file/reposi
by joewalker 9y ago
I don't know if http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Integer.java?av=f#1444 http://grepcode.com/file/repository.grepcode.com/java/root/j... is representative of all the implementations of bitCount in Java, but it's probably obvious that it's not going to use the popcnt opcode instruction.
I think the point is that Rust makes it much easier to use that opcode instruction. It's possible but hard with GCC using __builtin_popcount(), but, I'd guess totally impossible in Java due to lack of a JVM instruction for the same.
- vbezhenar 9y agoJIT-compiler might recognize this call and replace it with popcnt instruction. I'm not sure if it does that, though.
- the8472 9y agoThat's just the placeholder implementation that will work on any platform and even with the interpreter. If you look at the openjdk9 sources you will notice that it is annotated as intrinsic candidate[0]. But earlier versions also have intrinsics for that[1], it's just not annotated as such. [0] http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/23721aa1d87f/src/java.base/share/classes/java/lang/Integer.java#l1676 http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/23721aa1d87f/s... [1] https://gist.github.com/apangin/7a9b7062a4bd0cd41fcc#file-hotspot-jvm-intrinsics-L38 https://gist.github.com/apangin/7a9b7062a4bd0cd41fcc#file-ho...
- jmaloney10 9y agoThere are methods in Java which have special vm implementations to take advantage of instructions like this. They methods have an ordinary Java code version for the interpreter and on jit compilation are replaced with the other version. For a complete list of these types of functions see http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/classfile/vmSymbols.hpp#l581 http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee275...
- chrisseaton 9y ago> obvious that it's not going to use the popcnt opcode instruction ... I'd guess totally impossible in Java I don't understand why you would guess at what Java can do when you can find out for certain? public class Test { private static int bitCount(int a) { return Integer.bitCount(a); } public static void main(String[] args) { while (true) { bitCount(14); } } } Compiles bitCount to 0x000000011e637980: sub rsp,0x18 0x000000011e637987: mov QWORD PTR [rsp+0x10],rbp ;*synchronization entry ; - Test::bitCount@-1 (line 4) 0x000000011e63798c: popcnt eax,esi ;*invokestatic bitCount ; - Test::bitCount@1 (line 4) 0x000000011e637990: add rsp,0x10 0x000000011e637994: pop rbp 0x000000011e637995: test DWORD PTR [rip+0xfffffffff10ed665],eax # 0x000000010f725000 ; {poll_return} 0x000000011e63799b: ret There's your popcnt instruction. No need to guess.