2013-05-07 33 views
5

我聽說x86比較指令:cmp x, y執行減法並根據結果設置各種標誌。使用XOR而不是減法的x86比較指令

現在,如果我只是想測試兩個操作數是否相等呢?創傷做XOR而不是減法要快得多?我的問題是,有沒有一個指令與XOR進行比較來判斷兩個操作數是否相等?也許它看起來像這樣:cmpeq x, ycmpxor x, y

我想如果我只是想測試平等,使用cmpxor會比cmp,減法。有沒有像cmpxor這樣的指令可以讓我加速?

我也想說,我知道xor將設置zero flag。但如果我做xor x, y,它會改變x。我不想那樣。我想要一個比較指令,這將使操作數單獨存在。

+3

你爲什麼認爲異或會「快得多」? – jalf 2013-05-07 13:29:28

+0

它不會「快得多」,因爲'cmp'已經和其他指令一樣快(包括'xor')。在某些μarchs上,'cmp'指令甚至可以通過前端將相關的分支指令與一個單獨的μop進行融合,從而使其更快。這全部記錄在英特爾的優化手冊中,該手冊免費提供,值得一讀。 – 2013-05-07 13:49:29

+1

Ira Baxter說得很好:*從技術上講,SUB應該比XOR花費更多的時間,因爲進位必須「漣漪」通過所有的位,而XOR是逐位平行的。*這是我的邏輯。 – Aaron 2013-05-07 14:51:52

回答

11

XOR,SUB,CMP,TEST等基本機器操作都非常簡單,所以它們的運行速度都非常快。它們也設置相同的條件碼位。從比較相等的角度來看,這些都將Z位設置爲相同的方式;其他位的設置不同,因爲這些操作會計算不同的結果。

對於x86 CPU,這些執行時間沒有差異,因爲它們全都使用相同的芯片通路。因此,您可以在計算所需答案時使用其中的任何一個,而不會影響性能。 (從技術上說,SUB應該比XOR花費更長的時間,因爲進位必須「漣漪」通過所有的位,而XOR是逐位並行的.CPU設計人員已經想出了構建極其快速的進位計算邏輯的方法,時差並不重要,他們有這樣做的巨大動力,因爲計算機所做的大部分工作都是「增加」])。作爲一種風格約定,如果您認爲自己「比較兩個(機器字大小)」值,那麼您應該使用CMP指令,因爲它會將您正在考慮的內容傳達給讀者的代碼。它的優點是它不會破壞其中的一個操作數,一旦你編寫了足夠的代碼,你會發現它最終是一個非常有說服力的用來代替XOR的參數。 (TEST有這個不錯的屬性,對於檢查位也很有用)。

其他x86指令比較好的其他類型的值有比較:浮點比較,字符串比較,向量寄存器比較等。這些指令與基本操作的時間不同,因爲它們必須執行更復雜的操作(如比較多個數據字)。

+0

你有沒有可以查看執行時間的表格?我正在尋找這個,但沒有找到。 – Devolus 2013-05-07 13:28:10

+5

英特爾的性能優化手冊只有這樣的表 – jalf 2013-05-07 13:29:05

+0

因此,在'cmp'和'cmpxor'之間不管速度如何。這回答我的問題,謝謝。 – Aaron 2013-05-07 14:56:14