Ich versuche herauszufinden, welchen Zweck /jnp
Anweisungen in LLVM-generierten C-Code dienen. Beispiel:Useless jp/jnp Montageanleitung auf x86_64
int main(int argc, const char * argv[]) {
double value = 1.5;
if (value == 1.5) {
value = 3.0;
}
return 0;
}
Assembly Ausgabe:
Ltmp4:
movsd LCPI0_0(%rip), %xmm0
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
Ltmp5:
movsd %xmm0, -24(%rbp)
Ltmp6:
movsd -24(%rbp), %xmm1
ucomisd %xmm0, %xmm1
jne LBB0_2
jp LBB0_2
## BB#1:
movabsq $3, %rax
cvtsi2sdq %rax, %xmm0
Ltmp7:
movsd %xmm0, -24(%rbp)
Ltmp8:
LBB0_2:
movl $0, %eax
popq %rbp
retq
Die jne
wird überprüft, ob value != 1.5
und über die Zuweisung springen, aber was ist die jp
in diesem Zusammenhang zu tun?
Ich denke, du hast gesagt, llvm nicht optimierten Code oder etwas zu machen. Es gibt keine Möglichkeit, dass ein Compiler jemals "mov $ 0,% eax" anstelle von "xor% eax,% eax" mit irgendeiner Optimierungsebene ausgibt. Es gibt noch andere böse Sachen in diesem Code: 'movabsq $ 3,% rax 'ist 10 Bytes, verglichen mit' movl $ 3,% eax', hat aber einen völlig identischen Effekt. –