@mmix,
Evo sta Intel kompajler daje (asembler) na -O2, iskljucen inline - obe f-je su podrutine bez unrolling-a:
Prva varijanta:
Code:
; parameter 1(x): ecx
; parameter 2(y): edx
cmp ecx, edx ;9.3
cmovl edx, ecx ;9.3
mov eax, edx ;9.3
ret ;9.3
^ jedno poredjenje sa kondicionalnim mov-om.
Druga varijanta:
Code:
; parameter 1(x): ecx
; parameter 2(y): edx
mov r8d, 1 ;16.3
xor eax, eax ;16.3
xor r9d, r9d ;16.3
cmp ecx, edx ;16.3
cmovl eax, r8d ;16.3
cmovge r9d, r8d ;16.3
imul eax, ecx ;16.3
imul r9d, edx ;16.3
add eax, r9d ;16.3
ret ;9.3
^ Malo vise operacija ;-) - mada je dobar deo njih ocigledno suvisan ako se kod inlajnuje
Ako se ostavi inlining, stavi -O3, kompajler ce unroll-ovati ako je moguce i, naravno, inlajnovati.
Ali i pored toga ce ti prva f-ja biti brza.
Kompajler i jednu i drugu f-ju prevodi u asm koristeci cmov instrukcije.