2015-01-28 6 views
5

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?

+1

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. –

risposta

10

jne è jump if not equal, ad esempio saltare se il flag di zero non è impostato. jp è jump if parity.

ucomisd è definito per confrontare due doubles. Indica che sono una delle quattro cose: non ordinate, uguali, maggiori o minori di.

Il flag di zero viene impostato se i numeri sono non ordinati o uguali. Quindi il jne evita i casi rimanenti di maggiore o minore di.

La parità viene impostata solo se il risultato non è ordinato. Lo jp lo rileva.

Quindi i due insieme evitano: non ordinati, maggiori di, minori di. Lasciando solo la quarta possibilità, di uguale.

+1

Una nota sulla terminologia: "Non ordinato" significa che i due argomenti non hanno ordine di rilancio; cioè, che almeno uno di loro è un NaN. Se sono non-NaN e uguali, quello non è lo stesso è "non ordinato". – Dolda2000

+0

Ciò significa, tuttavia, che 'jne' rileva il caso in cui i numeri non sono uguali, e' jp' capta che i numeri non sono ordinati. Questi sono casi diversi e non ridondanti. – Dolda2000

+0

@ Dolda2000 in effetti; un fallimento della terminologia qui. Sono tutte e tre le bandiere impostate per non ordinate. – Tommy

Problemi correlati