Eu tenho a lista abaixo montagem como resultado para a compilação JIT para o meu programa java.
mov 0x14(%rsp),%r10d
inc %r10d
mov 0x1c(%rsp),%r8d
inc %r8d
test %eax,(%r11) ; <--- this instruction
mov (%rsp),%r9
mov 0x40(%rsp),%r14d
mov 0x18(%rsp),%r11d
mov %ebp,%r13d
mov 0x8(%rsp),%rbx
mov 0x20(%rsp),%rbp
mov 0x10(%rsp),%ecx
mov 0x28(%rsp),%rax
movzbl 0x18(%r9),%edi
movslq %r8d,%rsi
cmp 0x30(%rsp),%rsi
jge 0x00007fd3d27c4f17
Minha compreensão da test
instrução é inútil aqui, porque a idéia principal do teste é
As bandeiras SF, ZF, PF são modificados enquanto o resultado do AND é descartado.
e aqui não usamos estas bandeiras de resultados.
É um bug no JIT ou eu perdi alguma coisa? Se for, onde o melhor lugar para relatá-lo? Obrigado!
Esse deve ser o poll handshake segmento local . Veja onde %r11
é lido. Se ele é lido de algum deslocamento para fora da %r15
(armazenamento local de segmento), que é o cara. Veja o exemplo aqui :
0.31% ↗ ...70: movzbl 0x94(%r9),%r10d
0.19% │ ...78: mov 0x108(%r15),%r11 ; read the thread-local page addr
25.62% │ ...7f: add $0x1,%rbp
35.10% │ ...83: test %eax,(%r11) ; thread-local handshake poll
34.91% │ ...86: test %r10d,%r10d
╰ ...89: je ...70
Não é inútil, causaria SEGV uma vez que a página de proteção é marcado como não lido por todos, e que iria transferir o controle para manipulador SEGV do JVM. Isso faz parte da mecânica do JVM para encadeamentos Java ponto seguro, por exemplo, para GC.
UPD: Esperemos que, mais detalhes aqui .