unsigned short VIM_IPP_MaxDivisor(unsigned short a, unsigned short b) {
  while (a && b) {
    if (a > b)
      a %= b;
    else
      b %= a;
  }
  if (a)
    return a;
  return b;
}


x86 assembly (clang, -O0):
<VIM_IPP_MaxDivisor>:
push   %rbp
mov    %rsp,%rbp
mov    %si,%ax
mov    %di,%cx
mov    %cx,-0x4(%rbp)
mov    %ax,-0x6(%rbp)
movzwl -0x4(%rbp),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x7(%rbp)
je     1131 <VIM_IPP_MaxDivisor+0x31>
movzwl -0x6(%rbp),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x7(%rbp)
mov    -0x7(%rbp),%al
test   $0x1,%al
jne    1141 <VIM_IPP_MaxDivisor+0x41>
jmp    117f <VIM_IPP_MaxDivisor+0x7f>
movzwl -0x4(%rbp),%eax
movzwl -0x6(%rbp),%ecx
cmp    %ecx,%eax
jle    1168 <VIM_IPP_MaxDivisor+0x68>
movzwl -0x6(%rbp),%ecx
movzwl -0x4(%rbp),%eax
cltd
idiv   %ecx
mov    %dx,%ax
mov    %ax,-0x4(%rbp)
jmp    117a <VIM_IPP_MaxDivisor+0x7a>
movzwl -0x4(%rbp),%ecx
movzwl -0x6(%rbp),%eax
cltd
idiv   %ecx
mov    %dx,%ax
mov    %ax,-0x6(%rbp)
jmp    1112 <VIM_IPP_MaxDivisor+0x12>
cmpw   $0x0,-0x4(%rbp)
je     1197 <VIM_IPP_MaxDivisor+0x97>
mov    -0x4(%rbp),%ax
mov    %ax,-0x2(%rbp)
jmp    119f <VIM_IPP_MaxDivisor+0x9f>
mov    -0x6(%rbp),%ax
mov    %ax,-0x2(%rbp)
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<VIM_IPP_MaxDivisor>:
test   %edi,%edi
jne    111e <VIM_IPP_MaxDivisor+0x1e>
jmp    1136 <VIM_IPP_MaxDivisor+0x36>
cs nopw 0x0(%rax,%rax,1)
mov    %esi,%eax
xor    %edx,%edx
div    %di
mov    %edx,%esi
test   %di,%di
je     1136 <VIM_IPP_MaxDivisor+0x36>
test   %si,%si
je     1136 <VIM_IPP_MaxDivisor+0x36>
cmp    %si,%di
jbe    1110 <VIM_IPP_MaxDivisor+0x10>
mov    %edi,%eax
xor    %edx,%edx
div    %si
mov    %edx,%edi
test   %di,%di
jne    111e <VIM_IPP_MaxDivisor+0x1e>
test   %di,%di
cmove  %esi,%edi
mov    %edi,%eax
ret

LLVM IR (-O0):
define zeroext i16 @VIM_IPP_MaxDivisor(i16 zeroext %0, i16 zeroext %1) {
%3 = alloca i16
%4 = alloca i16
%5 = alloca i16
store i16 %0, i16* %4
store i16 %1, i16* %5
br label %6
6: ; preds = %36, %2
%7 = load i16, i16* %4
%8 = zext i16 %7 to i32
%9 = icmp ne i32 %8, 0
br i1 %9, label %10, label %14
10: ; preds = %6
%11 = load i16, i16* %5
%12 = zext i16 %11 to i32
%13 = icmp ne i32 %12, 0
br label %14
14: ; preds = %10, %6
%15 = phi i1 [ false, %6 ], [ %13, %10 ]
br i1 %15, label %16, label %37
16: ; preds = %14
%17 = load i16, i16* %4
%18 = zext i16 %17 to i32
%19 = load i16, i16* %5
%20 = zext i16 %19 to i32
%21 = icmp sgt i32 %18, %20
br i1 %21, label %22, label %29
22: ; preds = %16
%23 = load i16, i16* %5
%24 = zext i16 %23 to i32
%25 = load i16, i16* %4
%26 = zext i16 %25 to i32
%27 = srem i32 %26, %24
%28 = trunc i32 %27 to i16
store i16 %28, i16* %4
br label %36
29: ; preds = %16
%30 = load i16, i16* %4
%31 = zext i16 %30 to i32
%32 = load i16, i16* %5
%33 = zext i16 %32 to i32
%34 = srem i32 %33, %31
%35 = trunc i32 %34 to i16
store i16 %35, i16* %5
br label %36
36: ; preds = %29, %22
br label %6
37: ; preds = %14
%38 = load i16, i16* %4
%39 = icmp ne i16 %38, 0
br i1 %39, label %40, label %42
40: ; preds = %37
%41 = load i16, i16* %4
store i16 %41, i16* %3
br label %44
42: ; preds = %37
%43 = load i16, i16* %5
store i16 %43, i16* %3
br label %44
44: ; preds = %42, %40
%45 = load i16, i16* %3
ret i16 %45
}

LLVM IR (-O2):
define zeroext i16 @VIM_IPP_MaxDivisor(i16 zeroext %0, i16 zeroext %1) {
%3 = icmp ne i16 %0, 0
%4 = icmp ne i16 %1, 0
%5 = and i1 %3, %4
br i1 %5, label %6, label %20
6: ; preds = %2, %14
%7 = phi i16 [ %16, %14 ], [ %1, %2 ]
%8 = phi i16 [ %15, %14 ], [ %0, %2 ]
%9 = icmp ugt i16 %8, %7
br i1 %9, label %10, label %12
10: ; preds = %6
%11 = urem i16 %8, %7
br label %14
12: ; preds = %6
%13 = urem i16 %7, %8
br label %14
14: ; preds = %12, %10
%15 = phi i16 [ %11, %10 ], [ %8, %12 ]
%16 = phi i16 [ %7, %10 ], [ %13, %12 ]
%17 = icmp ne i16 %15, 0
%18 = icmp ne i16 %16, 0
%19 = select i1 %17, i1 %18, i1 false
br i1 %19, label %6, label %20
20: ; preds = %14, %2
%21 = phi i16 [ %0, %2 ], [ %15, %14 ]
%22 = phi i16 [ %1, %2 ], [ %16, %14 ]
%23 = icmp eq i16 %21, 0
%24 = select i1 %23, i16 %22, i16 %21
ret i16 %24
}