2013-05-07 18 views
5

x86 karşılaştırma talimatının: cmp x, y bir çıkarma işlemini gerçekleştirdiğini ve sonuca göre çeşitli bayrakları ayarladığını duydum.x86 XOR'u Çıkarma Yerine Kullanan Karşılaştırma Talimatı

Şimdi, eğer iki işlenenin eşit olup olmadığını sınamak istiyorsam ne olur? Bir çıkarma yerine XOR yapmak çok daha hızlı mı? Benim sorum şu, iki işlenenin eşit olup olmadığını anlamak için bir XOR ile bir karşılaştırma yapan bir talimat var mı? Belki de şu şekilde görünürdü: cmpeq x, y veya cmpxor x, y.

Sadece eşitlik için test etmek istersem, cmpxor kullanmak cmp'dan daha hızlı olurdu, bu bir çıkarma işlemi yapar. Bana bir hızlanma verecek cmpxor gibi bir talimat var mı?

Ayrıca, xor'un zero flag'u ayarlayacağını bildiğimi de söylemek isterim. Ancak xor x, y yaparsam, x değiştirir. Bunu istemiyorum. Hem işlenenleri yalnız bırakacak bir karşılaştırma talimatı istiyorum.

+3

Neden XOR'un "çok daha hızlı" olacağını varsayalım? – jalf

+0

“cmp” zaten başka herhangi bir komut (xor dahil) kadar hızlı olduğu için “daha ​​hızlı” olmazdı. Bazı µarchlerde, 'cmp' komutu, bağımlı bir branşman talimatıyla, ön uç tarafından tek bir opop'a bağlanabilir ve bu da daha hızlı bir şekilde daha hızlı hale getirilebilir. Bu, Intel’in elverişli ve okunmaya değer olan Optimizasyon El Kitabında belgelenmiştir. –

+1

Ira Baxter bunu çok iyi söyledi: * Teknik olarak bir SUB XOR'den daha uzun sürmeli çünkü XOR bit-by-bit paralel iken, bu da benim mantığımdı. – Aaron

cevap

11

XOR, SUB, CMP, TEST gibi temel makine işlemleri yeterince basit olduğundan, hepsi çok hızlı çalışır. Aynı durum kodu bitlerini de ayarladılar. Eşitlik açısından bakıldığında, bunların hepsi Z bitini aynı şekilde belirler; Diğer bitler farklı şekilde ayarlanır çünkü bu işlemler farklı sonuçlar hesaplar.

x86 CPU'ları için, bunların hepsinin yürütme sürelerinde bir fark yoktur, çünkü bunların hepsi çip üzerinden aynı yolları kullanırlar. Sonuç olarak, herhangi birini, istediğiniz cevabı hesapladığı performans cezası olmadan kullanabilirsiniz. (Teknik olarak bir SUB XOR'den daha uzun sürmelidir çünkü XOR bit-by-bit paralel iken, taşıma bitleri tüm bitler boyunca "dalgalanma" yapmak zorundadır. CPU tasarımcıları, son derece hızlı taşıma-hesaplama mantığını inşa etmenin yollarını bulmuştur. zaman farkı önemli değil.Bunu yapmak için büyük bir motivasyonları var, çünkü bir bilgisayarın yaptığı şey "add"]).

Bir stil kuralı olarak, "iki (makine-kelime büyüklüğü) değerleri karşılaştırıyor" diye düşünüyorsanız, CMP komutunu kullanmalısınız, çünkü bu sizin kodunuzun okuyucusuna ne düşündüğünüzü iletir. Ve, yeterli sayıda kod yazdıktan sonra, XOR yerine onu kullanmak için nihayetinde çok ikna edici bir argüman bulacağınız, işlenenlerden birini yok etmemesi avantajına sahiptir. (TEST de bu güzel özelliği vardır, bitleri kontrol etmek için de faydalıdır).

Diğer x86 yönergelerinin daha iyi olduğu başka türden değerler vardır: kayan karşılaştırmalar, dize karşılaştırmaları, vektör kaydı karşılaştırmaları, vb. Bu komutlar temel işlemlerden farklı zamanlar alırlar çünkü daha karmaşık şeyler yapmaları gerekir (çoklu veri kelimelerinin karşılaştırılması.

+0

Yürütme sürelerini araştırabileceğiniz bir tablonuz var mı? Bunu arıyordum ama bir tane bulamadım. – Devolus

+5

Intel'in performans optimizasyon kılavuzları sadece – jalf

+0

gibi tablolara sahiptir. Bu nedenle, bir "cmp" ile "cmpxor" arasında herhangi bir hız farkı olmayacaktır. Bu soruma cevap veriyor, teşekkürler. – Aaron