![]() | ![]() ![]() ![]() |
On comp.lang.asm.x86, Jon Kirwan asked for compiler output for the "greatest common divisor" function from the following C implementation:
unsigned int gcd (unsigned int a, unsigned int b)
{
if (a == 0 && b == 0)
b = 1;
else if (b == 0)
b = a;
else if (a != 0)
while (a != b)
if (a < b)
b -= a;
else
a -= b;
return b;
}Here is the assembly imlementation (optimised):;
; gcd - greatest common divisor
; by Paul Hsieh
;
; input:
; eax = a
; ebx = b
;
; output:
; eax = gcd
;
; destroys:
; edx
; flags
;
gcd: neg eax
je L3
L1: neg eax
xchg eax,edx
L2: sub eax,edx
jg L2
jne L1
L3: add eax,edx
jne L4
inc eax
L4: retAlthough xchg is not a particularly fast Intel instruction, it does help make it very tight, and probably not more than a cycle off of optimal for performance. The main loop of the routine exists entirely within an instruction prefetch buffer (16 bytes.)