Sto cercando di capire quale scopo le istruzioni jp
/jnp
servono nel codice C generato da LLVM. Esempio: uscitaIstruzioni di assemblaggio jp/jnp inutili su x86_64
int main(int argc, const char * argv[]) {
double value = 1.5;
if (value == 1.5) {
value = 3.0;
}
return 0;
}
Assemblea:
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
Il jne
sta controllando se value != 1.5
e saltando l'assegnazione, ma qual è la jp
facendo in questo contesto?
Penso che tu abbia detto a llvm di non realizzare codice ottimizzato, o qualcosa del genere. In nessun modo un compilatore emetterebbe mai 'mov $ 0,% eax' invece di' xor% eax,% eax' con qualsiasi livello di ottimizzazione. Ci sono altre cose sgradevoli in questo codice: 'movabsq $ 3,% rax' è 10 byte, rispetto a' movl $ 3,% eax', ma ha un effetto completamente identico. –