Optymalizacja skoków i wywołań funkcji
Eliminacja skoków bezwarunkowych

Funkcja:
    push ebp
    mov  ebp, esp
    mov  ecx, [iloscElementow]
    lea  edx, [adresTablicy]
    mov  eax, [wartoscProgowa]
 
Loop1:                    ; początek pętli
    cmp eax, [edx+4*ecx-4]  ; if-else
    ja  ElseBranch
    ...                   ; pierwsza gałąź
    jmp EndIf
ElseBranch:
    ....                  ; druga gałąź
EndIf:
    sub ecx, 1            ; epilog pętli
    jnz Loop1
 
    mov esp, ebp          ; epilog funkcji
    pop ebp
    ret

Przez powielenie epilogu pętli mozemy wyeliminować skok do EndIf

Funkcja:
    push ebp
    mov  ebp, esp
    mov  ecx, [iloscElementow]
    lea  edx, [adresTablicy]
    mov  eax, [wartoscProgowa]
 
Loop1:                    ; początek pętli
    cmp eax, [edx+4*ecx-4]  ; if-else
    ja  ElseBranch
    ...                   ; pierwsza gałąź
    sub ecx, 1            ; epilog pętli 1
    jnz Loop1
    jmp EndLoop
 
ElseBranch:
    ....                  ; druga gałąź
    sub ecx, 1            ; epilog pętli 2
    jnz Loop1
EndLoop:    
    mov esp, ebp          ; epilog funkcji
    pop ebp
    ret

Przez powielenie epilogu funkcji mozemy wyeliminować skok do EndLoop (tutaj zysk prędkości jest już niewielki).

Funkcja:
    push ebp
    mov  ebp, esp
    mov  ecx, [iloscElementow]
    lea  edx, [adresTablicy]
    mov  eax, [wartoscProgowa]
 
Loop1:                    ; początek pętli
    cmp eax, [edx+4*ecx-4]  ; if-else
    ja  ElseBranch
    ...                   ; pierwsza gałąź
    sub ecx, 1            ; epilog pętli 1
    jnz Loop1
    mov esp, ebp          ; epilog funkcji 1
    pop ebp
    ret
ElseBranch:
    ....                  ; druga gałąź
    sub ecx, 1            ; epilog pętli 2
    jnz Loop1
 
    mov esp, ebp          ; epilog funkcji 2
    pop ebp
    ret


Tomasz Kapela, Kraków 2011-2020