Slide 7
Slide 7 text
#DevoxxFR
# {method} {0x00007f8a0bc00388} 'hello' '(Ljava/lang/String;I)Ljava/lang/String;' in 'Hello'
# parm0: rsi:rsi = 'java/lang/String'
# parm1: rdx = int
# [sp+0x40] (sp of caller)
0x00007f8a1907a6a0: mov %eax,-0x14000(%rsp)
0x00007f8a1907a6a7: push %rbp
0x00007f8a1907a6a8: sub $0x30,%rsp ;*synchronization entry
; - Hello::hello@-1 (line 3)
0x00007f8a1907a6ac: mov %rsi,%rcx
0x00007f8a1907a6af: test %rsi,%rsi
0x00007f8a1907a6b2: jne 0x00007f8a1907a9b5
0x00007f8a1907a6b8: mov $0x76d103fb0,%rbp ; {oop("null")}
0x00007f8a1907a6c2: mov 0xc(%rbp),%r10d
0x00007f8a1907a6c6: mov 0xc(%r12,%r10,8),%esi
0x00007f8a1907a6cb: mov %esi,%r10d
0x00007f8a1907a6ce: add $0x5,%r10d
0x00007f8a1907a6d2: test %r10d,%r10d
0x00007f8a1907a6d5: jl 0x00007f8a1907a99a
0x00007f8a1907a6db: mov %edx,%r13d
0x00007f8a1907a6de: neg %r13d
0x00007f8a1907a6e1: mov %edx,%r8d
0x00007f8a1907a6e4: cmp $0x80000000,%edx
0x00007f8a1907a6ea: jne 0x00007f8a1907a91b
0x00007f8a1907a6f0: xor %r14d,%r14d
0x00007f8a1907a6f3: mov $0xb,%ebx
0x00007f8a1907a6f8: jmp 0x00007f8a1907a712
0x00007f8a1907a6fa: nopw 0x0(%rax,%rax,1)
0x00007f8a1907a700: inc %r11d
0x00007f8a1907a703: mov 0x10(%rdi,%r11,4),%r9d
0x00007f8a1907a708: cmp %r9d,%r10d
0x00007f8a1907a70b: jg 0x00007f8a1907a700
0x00007f8a1907a70d: add %r11d,%ebx
0x00007f8a1907a710: inc %ebx
0x00007f8a1907a712: mov %ebx,%r10d
0x00007f8a1907a715: add %esi,%r10d
0x00007f8a1907a718: mov %r10d,%edx
0x00007f8a1907a71b: add $0x5,%edx
0x00007f8a1907a71e: test %edx,%edx
0x00007f8a1907a720: jl 0x00007f8a1907a99d
0x00007f8a1907a726: cmp $0x80000,%edx
0x00007f8a1907a72c: ja 0x00007f8a1907a95e
0x00007f8a1907a732: mov 0x60(%r15),%r9
0x00007f8a1907a736: movslq %r10d,%r10
0x00007f8a1907a739: shl %r10
0x00007f8a1907a73c: add $0x21,%r10
0x00007f8a1907a740: and $0xfffffffffffffff8,%r10
0x00007f8a1907a744: mov %r9,%r11
0x00007f8a1907a747: add %r10,%r11
0x00007f8a1907a74a: cmp 0x70(%r15),%r11
0x00007f8a1907a74e: jae 0x00007f8a1907a95e
0x00007f8a1907a754: mov %r11,0x60(%r15)
0x00007f8a1907a758: prefetchw 0xc0(%r11)
0x00007f8a1907a760: movq $0x1,(%r9)
0x00007f8a1907a767: prefetchw 0x100(%r11)
0x00007f8a1907a76f: movl $0xf8000041,0x8(%r9) ; {metadata({type array char})}
0x00007f8a1907a777: mov %edx,0xc(%r9)
0x00007f8a1907a77b: prefetchw 0x140(%r11)
0x00007f8a1907a783: prefetchw 0x180(%r11)
7
What does the JIT generate ?
0x00007f8a1907a78b: mov %rcx,(%rsp)
0x00007f8a1907a78f: mov %r8d,0x8(%rsp)
0x00007f8a1907a794: mov 0xc(%rbp),%r10d
0x00007f8a1907a798: mov %r9,%rsi
0x00007f8a1907a79b: add $0x1a,%rsi
0x00007f8a1907a79f: mov 0xc(%r12,%r10,8),%ebp
0x00007f8a1907a7a4: lea (%r12,%r10,8),%r11
0x00007f8a1907a7a8: lea 0x10(%r12,%r10,8),%rdi
0x00007f8a1907a7ad: movslq %ebp,%r10
0x00007f8a1907a7b0: mov %r10,0x18(%rsp)
0x00007f8a1907a7b5: mov $0x68,%r10d
0x00007f8a1907a7bb: mov %r10w,0x10(%r9)
0x00007f8a1907a7c0: mov $0x6f,%r8d
0x00007f8a1907a7c6: mov $0x65,%r11d
0x00007f8a1907a7cc: mov %r11w,0x12(%r9)
0x00007f8a1907a7d1: mov $0x6c,%r10d
0x00007f8a1907a7d7: mov %r10w,0x14(%r9)
0x00007f8a1907a7dc: mov %r10w,0x16(%r9)
0x00007f8a1907a7e1: mov %r8w,0x18(%r9)
0x00007f8a1907a7e6: mov %r9,0x10(%rsp)
0x00007f8a1907a7eb: mov 0x18(%rsp),%rdx
0x00007f8a1907a7f0: mov $0x7f8a19052300,%r10
0x00007f8a1907a7fa: callq *%r10
0x00007f8a1907a7fd: mov 0x8(%rsp),%r10d
0x00007f8a1907a802: cmp $0x80000000,%r10d
0x00007f8a1907a809: je 0x00007f8a1907a81c
0x00007f8a1907a80b: mov 0x8(%rsp),%r8d
0x00007f8a1907a810: test %r10d,%r10d
0x00007f8a1907a813: jl 0x00007f8a1907a852
0x00007f8a1907a815: mov 0x8(%rsp),%r13d
0x00007f8a1907a81a: jmp 0x00007f8a1907a858
0x00007f8a1907a81c: mov 0x18(%rsp),%r10
0x00007f8a1907a821: mov 0x10(%rsp),%r11
0x00007f8a1907a826: lea 0x1a(%r11,%r10,2),%rsi
0x00007f8a1907a82b: mov $0xb,%edx
0x00007f8a1907a830: mov $0x76d103ff8,%rdi ; {oop([C)}
0x00007f8a1907a83a: add $0x10,%rdi
0x00007f8a1907a83e: mov $0x7f8a19052300,%r10
0x00007f8a1907a848: callq *%r10
0x00007f8a1907a84b: mov 0x8(%rsp),%r8d
0x00007f8a1907a850: jmp 0x00007f8a1907a8b5
0x00007f8a1907a852: mov $0x2d,%r14d
0x00007f8a1907a858: add %ebp,%ebx
0x00007f8a1907a85a: add $0x5,%ebx
0x00007f8a1907a85d: mov %r13d,%r11d
0x00007f8a1907a860: sar $0x1f,%r11d
0x00007f8a1907a864: movslq %r13d,%r10
0x00007f8a1907a867: imul $0x66666667,%r10,%r10
0x00007f8a1907a86e: sar $0x22,%r10
0x00007f8a1907a872: mov %r10d,%r10d
0x00007f8a1907a875: mov %r10d,%edx
0x00007f8a1907a878: sub %r11d,%edx
0x00007f8a1907a87b: mov %edx,%r9d
0x00007f8a1907a87e: shl $0x3,%r9d
0x00007f8a1907a882: mov %edx,%ecx
0x00007f8a1907a884: shl %ecx
0x00007f8a1907a886: add %r9d,%ecx
0x00007f8a1907a889: sub %ecx,%r13d
0x00007f8a1907a88c: add $0x30,%r13d
0x00007f8a1907a890: mov 0x10(%rsp),%r9
0x00007f8a1907a895: mov %r13w,0xe(%r9,%rbx,2)
0x00007f8a1907a89b: cmp %r11d,%r10d
0x00007f8a1907a89e: je 0x00007f8a1907a8a7
0x00007f8a1907a8a0: dec %ebx
0x00007f8a1907a8a2: mov %edx,%r13d
0x00007f8a1907a8a5: jmp 0x00007f8a1907a85d
0x00007f8a1907a8a7: test %r14d,%r14d
0x00007f8a1907a8aa: je 0x00007f8a1907a8b5
0x00007f8a1907a8ac: add $0xfffffffffffffffe,%ebx
0x00007f8a1907a8af: mov %r14w,0x10(%r9,%rbx,2)
0x00007f8a1907a8b5: mov 0x60(%r15),%rax
0x00007f8a1907a8b9: mov %rax,%r10
0x00007f8a1907a8bc: add $0x18,%r10
0x00007f8a1907a8c0: cmp 0x70(%r15),%r10
0x00007f8a1907a8c4: jae 0x00007f8a1907a943
0x00007f8a1907a8c6: mov %r10,0x60(%r15)
0x00007f8a1907a8ca: prefetchw 0xc0(%r10)
0x00007f8a1907a8d2: mov $0xf80002da,%r11d ; {metadata('java/lang/String')}
0x00007f8a1907a8d8: mov $0x0,%r10
0x00007f8a1907a8e2: lea (%r10,%r11,8),%r10
0x00007f8a1907a8e6: mov 0xa8(%r10),%r10
0x00007f8a1907a8ed: mov %r10,(%rax)
0x00007f8a1907a8f0: movl $0xf80002da,0x8(%rax) ; {metadata('java/lang/String')}
0x00007f8a1907a8f7: mov %r12d,0xc(%rax)
0x00007f8a1907a8fb: mov %r12,0x10(%rax)
0x00007f8a1907a8ff: mov 0x10(%rsp),%r10
0x00007f8a1907a904: mov %r10,%r11
0x00007f8a1907a907: shr $0x3,%r11
0x00007f8a1907a90b: mov %r11d,0xc(%rax)
0x00007f8a1907a90f: add $0x30,%rsp
0x00007f8a1907a913: pop %rbp
0x00007f8a1907a914: test %eax,0xa2a36e6(%rip) # 0x00007f8a2331e000
; {poll_return}
0x00007f8a1907a91a: retq
/usr/jdk/jdk1.8.0/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly Hello