我想寫一個(非常)短的程序集測試兩個dwords的相等性並返回一個布爾值(1 = true,0 = false)。到目前爲止,我已經提出了三種方法,其中一種使用LAHF,這在某些x86_64處理器中顯然不受支持,所以不幸的是,有一種方法不適用。優化的程序集等式例程
版本之一:
mov eax, [esp + 8]
cmp b, [esp + 4]
mov eax, 1
jnz jpt
mov eax, 0
jpt: ret
兩個版本:
mov eax, [ebp + 8]
cmp b, [ebp + 4]
pushf ; Get lowest word of the flags register
pop ax
and eax, 0x0040 ; Extract the zero flag
shr eax, 6 ; eax is now true(1) if arg1 == arg2
ret
的一個版本有一個額外的分支指令,但有兩個版本有一個額外的推動和一個額外的POP指令。你希望哪一個最快,爲什麼?這是否取決於如果分支將被採取/預測或不?
既不是,因爲在任何真正的軟件中,瓶頸在兩個雙字的平等測試中不會發生。 – 2011-05-28 13:05:15
什麼是「真正的軟件」? – James 2011-05-28 13:10:45
只是_calling_「平等例程」的行爲可能比實際的比較更昂貴。 – Mat 2011-05-28 13:11:33