2015-04-07 69 views
1

我正在寫一個高級語言的JIT編譯器,它碰巧有時有兩種情況。在第一種情況下,接收對象在eax中,另一個在esi中。因此,幾個例程有兩個版本,一個基於eax,另一個基於esi。除此之外,這兩個版本在語義上是相同的。因此,我有兩個選擇:可以使用僞造的mov eax,esi嗎?

  1. 有條件地生成一個例程或其它,或
  2. 有條件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 

回答

1

你應該把它簡化了代碼的選項。一旦你的產品完成,如果你發現額外的舉措是一個重大的性能問題,你可以重新審視這個決定。區別在於你有探查器數據可以幫助你做出決定。

爲你+1,只是爲了解決JTI。 你會學到很多東西。

+0

很難找到一個能夠準確反映許多函數中單指令前導碼成本的探查器。我不認爲這個答案是有幫助的。 – StilesCrisis

相關問題