1
我正在寫一個高級語言的JIT編譯器,它碰巧有時有兩種情況。在第一種情況下,接收對象在eax
中,另一個在esi
中。因此,幾個例程有兩個版本,一個基於eax
,另一個基於esi
。除此之外,這兩個版本在語義上是相同的。因此,我有兩個選擇:可以使用僞造的mov eax,esi嗎?
- 有條件地生成一個例程或其它,或
- 有條件
mov eax, esi
,只產生eax
基於常規
只要不會被任何副作用,選項2對於高級代碼更好,因爲它簡化了(本地)代碼生成功能。但是,本地代碼將執行額外的mov eax, esi
而不是使用esi
作爲基址尋址寄存器。
問題:哪個選項更好?
我應該嘗試保存幾個CPU週期並避免額外的mov
,還是應該選擇簡化高級代碼,因爲性能差異可以忽略不計?
例
注:imm8
僅僅是適當的字節的佔位符常數
EAX基於例程:
test byte ptr [eax + imm8], imm8 ; EAX
jz @1
mov eax, [eax + imm8] ; EAX
jmp @2
@1:
mov al, [eax + imm8] ; EAX
and eax, 255
@2:
sal eax
inc eax
基於ESI-例程(選項1) :
test byte ptr [esi + imm8], imm8 ; ESI
jz @1
mov eax, [esi + imm8] ; ESI
jmp @2
@1:
mov al, [esi + imm8] ; ESI
and eax, 255
@2:
sal eax
inc eax
基於ESI-例程(選項2):
mov eax, esi ; not present in option 1
test byte ptr [eax + imm8], imm8 ; EAX-based from now on
jz @1
mov eax, [eax + imm8]
jmp @2
@1:
mov al, [eax + imm8]
and eax, 255
@2:
sal eax
inc eax
很難找到一個能夠準確反映許多函數中單指令前導碼成本的探查器。我不認爲這個答案是有幫助的。 – StilesCrisis