2013-05-07 5 views
5

Ho sentito che l'istruzione di confronto x86: cmp x, y esegue una sottrazione e imposta vari flag in base al risultato.x86 Istruzione di confronto che utilizza XOR invece di sottrazione

Ora, cosa succede se voglio solo verificare se i due operandi sono uguali? Non fare un XOR invece di una sottrazione è molto più veloce? La mia domanda è, c'è un'istruzione che faccia un confronto con un XOR per dire se i due operandi sono uguali? Forse sarebbe simile a questo: cmpeq x, y o cmpxor x, y.

Direi che se voglio solo testare per l'uguaglianza, usare uno sarebbe più veloce dello cmp, che fa una sottrazione. C'è una tale istruzione come cmpxor che mi darebbe un aumento di velocità?

Voglio anche dire che sono a conoscenza del fatto che lo xor imposterà lo zero flag. Ma se faccio xor x, y, cambierà x. Non lo voglio Voglio un'istruzione di confronto che lascerà entrambi gli operandi da soli.

+3

Per quale motivo si suppone che XOR sia "molto più veloce"? – jalf

+0

Non sarebbe "molto più veloce", dato che 'cmp' è già veloce come qualsiasi altra istruzione (incluso' xor'). Su alcuni μarch, l'istruzione 'cmp' può anche essere fusa con un'istruzione derivata dipendente in un singolo μop dal front-end, rendendolo effettivamente ancora più veloce. Tutto questo è documentato nel Manuale di ottimizzazione di Intel, che è liberamente disponibile e vale la pena leggerlo. –

+1

Ira Baxter lo ha detto molto bene: * Tecnicamente un SUB dovrebbe impiegare più tempo di XOR perché il carry deve "ripple" attraverso tutti i bit, mentre XOR è parallelo bit-by-bit. * Questa era la mia logica. – Aaron

risposta

11

Le operazioni di base della macchina come XOR, SUB, CMP, TEST sono tutte abbastanza semplici in modo che funzionino tutte estremamente velocemente. Hanno anche impostato gli stessi bit del codice di condizione. Dal punto di vista del confronto per parità, tutti impostano il bit Z allo stesso modo; altri bit sono impostati in modo diverso perché queste operazioni calcolano risultati diversi.

Per le CPU x86, non vi è alcuna differenza nei tempi di esecuzione di questi, poiché tutti utilizzano percorsi identici attraverso il chip. Di conseguenza, è possibile utilizzare uno qualsiasi di questi senza penalizzazione delle prestazioni dove calcola la risposta che si desidera. (Tecnicamente un SUB dovrebbe impiegare più tempo di XOR perché il carry deve "ripple" attraverso tutti i bit, mentre XOR è parallelo bit-by-bit. I progettisti della CPU hanno escogitato modi per costruire una logica di carry-computing estremamente veloce la differenza di fuso orario non è significativa, hanno una motivazione enorme per farlo, dal momento che la maggior parte di ciò che fa un computer è "aggiungere"]).

Come convenzione di stile, se si pensa di "confrontare due valori (dimensioni della parola macchina)", è consigliabile utilizzare l'istruzione CMP, poiché ciò comunica ciò che si pensa al lettore del codice. E ha il vantaggio che non distrugge uno degli operandi, che alla fine troverai un argomento molto persuasivo per usarlo al posto di XOR, una volta che hai scritto abbastanza codice. (TEST ha questa bella proprietà, utile anche per controllare i bit).

Ci sono dei confronti di altri tipi di valori per i quali altre istruzioni x86 sono migliori: confronti a virgola mobile, confronti a stringhe, confronti di registri vettoriali, ecc. Queste istruzioni impiegano tempi diversi rispetto alle operazioni di base perché devono fare cose più complicate (come confronto di più parole di dati).

+0

Hai una tabella in cui si possono cercare i tempi di esecuzione? Stavo cercando questo, ma non l'ho trovato. – Devolus

+5

I manuali di ottimizzazione delle prestazioni di Intel hanno solo queste tabelle – jalf

+0

Quindi non ci sarebbe alcuna differenza di velocità tra un 'cmp' e' cmpxor'. Questo risponde alla mia domanda, grazie. – Aaron