long percent(a, b, limit)
unsigned long a;
unsigned long b;
long limit;
{
  unsigned long q;
  unsigned long s;
  unsigned long t;
  q = 0;
  if (b == 0) {
    long p = (100);
    if (q) {
      if (q - 1 > limit / 100)
        return limit;
      if ((q - 1) * 100 > limit - 100)
        return limit;
      if (q * 100 > limit - p)
        return limit;
      return (long)(p + q * 100);
    } else if (p > limit)
      return limit;
    else
      return p;
  };
  ;
  if (b < ((unsigned long)(-1)) - 200)
    if (a < (((unsigned long)(-1)) / 200) - (b / 200) - 1) {
      long p = ((100 * a + (b / 2)) / b);
      if (q) {
        if (q - 1 > limit / 100)
          return limit;
        if ((q - 1) * 100 > limit - 100)
          return limit;
        if (q * 100 > limit - p)
          return limit;
        return (long)(p + q * 100);
      } else if (p > limit)
        return limit;
      else
        return p;
    };
  ;
  if (a < b / 200) {
    long p = (0);
    if (q) {
      if (q - 1 > limit / 100)
        return limit;
      if ((q - 1) * 100 > limit - 100)
        return limit;
      if (q * 100 > limit - p)
        return limit;
      return (long)(p + q * 100);
    } else if (p > limit)
      return limit;
    else
      return p;
  };
  ;
  ;
  ;
  if (a >= b) {
    q = a / b;
    ;
    ;
    a -= q * b;
  };
  ;
  t = 0;
  s = a;
  if (s >= b - a) {
    t += 1;
    s -= b - a;
  } else {
    s += a;
  }
  if (s >= b - a) {
    t += 1;
    s -= b - a;
  } else {
    s += a;
  }
  if (s >= b - s) {
    t += t + 1;
    s -= b - s;
  } else {
    t += t;
    s += s;
  }
  if (s >= b - s) {
    t += t + 1;
    s -= b - s;
  } else {
    t += t;
    s += s;
  }
  if (s >= b - s) {
    t += t + 1;
    s -= b - s;
  } else {
    t += t;
    s += s;
  }
  if (s >= b - a) {
    t += 1;
    s -= b - a;
  } else {
    s += a;
  }
  if (s >= b - s) {
    t += t + 1;
    s -= b - s;
  } else {
    t += t;
    s += s;
  }
  if (s >= b - s) {
    t += t + 1;
    s -= b - s;
  } else {
    t += t;
    s += s;
  }
  if (s >= b - (b / 2)) {
    t += 1;
    s -= b - (b / 2);
  } else {
    s += (b / 2);
  }
  {
    long p = (t);
    if (q) {
      if (q - 1 > limit / 100)
        return limit;
      if ((q - 1) * 100 > limit - 100)
        return limit;
      if (q * 100 > limit - p)
        return limit;
      return (long)(p + q * 100);
    } else if (p > limit)
      return limit;
    else
      return p;
  }
}


x86 assembly (clang, -O0):
<percent>:
push   %rbp
mov    %rsp,%rbp
push   %rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    11f8 <percent+0xf8>
movq   $0x64,-0x40(%rbp)
cmpq   $0x0,-0x28(%rbp)
je     11d0 <percent+0xd0>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x60(%rbp)
mov    -0x20(%rbp),%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x60(%rbp),%rax
cmp    %rcx,%rax
jbe    116e <percent+0x6e>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
imul   $0x64,%rax,%rax
mov    -0x20(%rbp),%rcx
sub    $0x64,%rcx
cmp    %rcx,%rax
jbe    1198 <percent+0x98>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
imul   $0x64,-0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    -0x40(%rbp),%rcx
cmp    %rcx,%rax
jbe    11bb <percent+0xbb>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x40(%rbp),%rax
imul   $0x64,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jle    11eb <percent+0xeb>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x40(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
cmpq   $0xffffffffffffff37,-0x18(%rbp)
ff
jae    132a <percent+0x22a>
mov    -0x10(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x18(%rbp),%rax
mov    $0xc8,%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,%rdx
mov    -0x68(%rbp),%rax
movabs $0x147ae147ae147ae,%rcx
ae 47 01
sub    %rdx,%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jae    1325 <percent+0x225>
imul   $0x64,-0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
shr    $0x1,%rcx
add    %rcx,%rax
xor    %ecx,%ecx
mov    %ecx,%edx
divq   -0x18(%rbp)
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x28(%rbp)
je     12fd <percent+0x1fd>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x70(%rbp)
mov    -0x20(%rbp),%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x70(%rbp),%rax
cmp    %rcx,%rax
jbe    129b <percent+0x19b>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
imul   $0x64,%rax,%rax
mov    -0x20(%rbp),%rcx
sub    $0x64,%rcx
cmp    %rcx,%rax
jbe    12c5 <percent+0x1c5>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
imul   $0x64,-0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    -0x48(%rbp),%rcx
cmp    %rcx,%rax
jbe    12e8 <percent+0x1e8>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x48(%rbp),%rax
imul   $0x64,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jle    1318 <percent+0x218>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x48(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
jmp    132a <percent+0x22a>
mov    -0x10(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x18(%rbp),%rax
mov    $0xc8,%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,%rcx
mov    -0x78(%rbp),%rax
cmp    %rcx,%rax
jae    1424 <percent+0x324>
movq   $0x0,-0x50(%rbp)
cmpq   $0x0,-0x28(%rbp)
je     13fc <percent+0x2fc>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x80(%rbp)
mov    -0x20(%rbp),%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x80(%rbp),%rax
cmp    %rcx,%rax
jbe    139a <percent+0x29a>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
imul   $0x64,%rax,%rax
mov    -0x20(%rbp),%rcx
sub    $0x64,%rcx
cmp    %rcx,%rax
jbe    13c4 <percent+0x2c4>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
imul   $0x64,-0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    -0x50(%rbp),%rcx
cmp    %rcx,%rax
jbe    13e7 <percent+0x2e7>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x50(%rbp),%rax
imul   $0x64,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x50(%rbp),%rax
cmp    -0x20(%rbp),%rax
jle    1417 <percent+0x317>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x50(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
jb     1456 <percent+0x356>
mov    -0x10(%rbp),%rax
xor    %ecx,%ecx
mov    %ecx,%edx
divq   -0x18(%rbp)
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rcx
imul   -0x18(%rbp),%rcx
mov    -0x10(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x10(%rbp)
movq   $0x0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x10(%rbp),%rcx
cmp    %rcx,%rax
jb     149f <percent+0x39f>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x10(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    14ab <percent+0x3ab>
mov    -0x10(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x10(%rbp),%rcx
cmp    %rcx,%rax
jb     14e4 <percent+0x3e4>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x10(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    14f0 <percent+0x3f0>
mov    -0x10(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
cmp    %rcx,%rax
jb     152d <percent+0x42d>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1545 <percent+0x445>
mov    -0x38(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
cmp    %rcx,%rax
jb     1582 <percent+0x482>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    159a <percent+0x49a>
mov    -0x38(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
cmp    %rcx,%rax
jb     15d7 <percent+0x4d7>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    15ef <percent+0x4ef>
mov    -0x38(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x10(%rbp),%rcx
cmp    %rcx,%rax
jb     1628 <percent+0x528>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x10(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1634 <percent+0x534>
mov    -0x10(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
cmp    %rcx,%rax
jb     1671 <percent+0x571>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1689 <percent+0x589>
mov    -0x38(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
cmp    %rcx,%rax
jb     16c6 <percent+0x5c6>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
sub    -0x30(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    16de <percent+0x5de>
mov    -0x38(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    -0x18(%rbp),%rdx
shr    $0x1,%rdx
sub    %rdx,%rcx
cmp    %rcx,%rax
jb     1725 <percent+0x625>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
mov    -0x18(%rbp),%rax
shr    $0x1,%rax
sub    %rax,%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1735 <percent+0x635>
mov    -0x18(%rbp),%rax
shr    $0x1,%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x28(%rbp)
je     17e7 <percent+0x6e7>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x88(%rbp)
mov    -0x20(%rbp),%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x88(%rbp),%rax
cmp    %rcx,%rax
jbe    1785 <percent+0x685>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
imul   $0x64,%rax,%rax
mov    -0x20(%rbp),%rcx
sub    $0x64,%rcx
cmp    %rcx,%rax
jbe    17af <percent+0x6af>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
imul   $0x64,-0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    -0x58(%rbp),%rcx
cmp    %rcx,%rax
jbe    17d2 <percent+0x6d2>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x58(%rbp),%rax
imul   $0x64,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x58(%rbp),%rax
cmp    -0x20(%rbp),%rax
jle    1802 <percent+0x702>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    180a <percent+0x70a>
mov    -0x58(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x8,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<percent>:
mov    %rdx,%r10
test   %rsi,%rsi
je     115b <percent+0x5b>
mov    %rsi,%rax
shr    $0x3,%rax
movabs $0x28f5c28f5c28f5c3,%rcx
c2 f5 28
mul    %rcx
shr    $0x2,%rdx
cmp    $0xffffffffffffff36,%rsi
ja     116c <percent+0x6c>
movabs $0x147ae147ae147ad,%rax
ae 47 01
sub    %rdx,%rax
cmp    %rdi,%rax
jbe    116c <percent+0x6c>
imul   $0x64,%rdi,%rcx
mov    %rsi,%rax
shr    %rax
add    %rcx,%rax
mov    %rax,%rcx
or     %rsi,%rcx
shr    $0x20,%rcx
je     1189 <percent+0x89>
xor    %edx,%edx
div    %rsi
jmp    118d <percent+0x8d>
cmp    $0x64,%r10
mov    $0x64,%eax
cmovge %rax,%r10
mov    %r10,%rax
ret
cmp    %rdi,%rdx
jbe    117f <percent+0x7f>
mov    %r10,%rax
sar    $0x3f,%rax
and    %rax,%r10
mov    %r10,%rax
ret
cmp    %rsi,%rdi
jae    1198 <percent+0x98>
xor    %r8d,%r8d
jmp    11bf <percent+0xbf>
xor    %edx,%edx
div    %esi
cmp    %r10,%rax
cmovle %rax,%r10
mov    %r10,%rax
ret
mov    %rdi,%rax
or     %rsi,%rax
shr    $0x20,%rax
je     11b4 <percent+0xb4>
mov    %rdi,%rax
xor    %edx,%edx
div    %rsi
mov    %rax,%r8
mov    %rdx,%rdi
jmp    11bf <percent+0xbf>
mov    %edi,%eax
xor    %edx,%edx
div    %esi
mov    %eax,%r8d
mov    %edx,%edi
push   %r15
push   %r14
push   %rbx
mov    %rsi,%r9
sub    %rdi,%r9
lea    (%rdi,%rdi,1),%r11
xor    %edx,%edx
xor    %eax,%eax
mov    %rdi,%rcx
sub    %r9,%rcx
setb   %dl
setae  %al
cmovb  %r11,%rcx
mov    $0x2,%r11d
sub    %rdx,%r11
mov    %r9,%rdx
neg    %rdx
cmp    %r9,%rcx
cmovb  %rax,%r11
mov    %rdx,%rax
cmovb  %rdi,%rax
add    %rcx,%rax
mov    %rsi,%rcx
sub    %rax,%rcx
lea    (%rax,%rax,1),%r14
xor    %ebx,%ebx
sub    %rcx,%rax
cmovb  %r14,%rax
setae  %bl
mov    %rsi,%r15
sub    %rax,%r15
add    %rbx,%rbx
lea    (%rax,%rax,1),%r14
xor    %ecx,%ecx
sub    %r15,%rax
lea    (%rbx,%r11,4),%rbx
setae  %cl
cmovb  %r14,%rax
or     %rbx,%rcx
mov    %rsi,%rbx
sub    %rax,%rbx
lea    (%rax,%rax,1),%r11
xor    %r14d,%r14d
sub    %rbx,%rax
setae  %r14b
cmovb  %r11,%rax
lea    (%r14,%rcx,2),%rcx
cmp    %r9,%rax
sbb    $0xffffffffffffffff,%rcx
cmp    %r9,%rax
cmovb  %rdi,%rdx
add    %rax,%rdx
mov    %rsi,%rax
sub    %rdx,%rax
lea    (%rdx,%rdx,1),%rdi
xor    %ebx,%ebx
sub    %rax,%rdx
cmovb  %rdi,%rdx
setae  %bl
mov    %rsi,%rax
sub    %rdx,%rax
add    %rbx,%rbx
lea    (%rdx,%rdx,1),%r9
xor    %edi,%edi
sub    %rax,%rdx
lea    (%rbx,%rcx,4),%rax
cmovb  %r9,%rdx
setae  %dil
or     %rax,%rdi
mov    %rsi,%rax
shr    %rax
sub    %rax,%rsi
cmp    %rsi,%rdx
sbb    $0xffffffffffffffff,%rdi
test   %r8,%r8
pop    %rbx
pop    %r14
pop    %r15
je     1305 <percent+0x205>
lea    -0x1(%r8),%rcx
movabs $0xa3d70a3d70a3d70b,%rdx
0a d7 a3
mov    %r10,%rax
imul   %rdx
add    %r10,%rdx
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x6,%rdx
add    %rax,%rdx
cmp    %rdx,%rcx
ja     130c <percent+0x20c>
imul   $0x64,%rcx,%rax
lea    -0x64(%r10),%rcx
cmp    %rcx,%rax
ja     130c <percent+0x20c>
imul   $0x64,%r8,%rax
mov    %r10,%rcx
sub    %rdi,%rcx
add    %rax,%rdi
cmp    %rcx,%rax
cmovbe %rdi,%r10
mov    %r10,%rax
ret
cmp    %r10,%rdi
cmovle %rdi,%r10
mov    %r10,%rax
ret

LLVM IR (-O0):
define i64 @percent(i64 %0, i64 %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca i64
store i64 %0, i64* %5
store i64 %1, i64* %6
store i64 %2, i64* %7
store i64 0, i64* %8
%15 = load i64, i64* %6
%16 = icmp eq i64 %15, 0
br i1 %16, label %17, label %59
17: ; preds = %3
store i64 100, i64* %11
%18 = load i64, i64* %8
%19 = icmp ne i64 %18, 0
br i1 %19, label %20, label %51
20: ; preds = %17
%21 = load i64, i64* %8
%22 = sub i64 %21, 1
%23 = load i64, i64* %7
%24 = sdiv i64 %23, 100
%25 = icmp ugt i64 %22, %24
br i1 %25, label %26, label %28
26: ; preds = %20
%27 = load i64, i64* %7
store i64 %27, i64* %4
br label %413
28: ; preds = %20
%29 = load i64, i64* %8
%30 = sub i64 %29, 1
%31 = mul i64 %30, 100
%32 = load i64, i64* %7
%33 = sub nsw i64 %32, 100
%34 = icmp ugt i64 %31, %33
br i1 %34, label %35, label %37
35: ; preds = %28
%36 = load i64, i64* %7
store i64 %36, i64* %4
br label %413
37: ; preds = %28
%38 = load i64, i64* %8
%39 = mul i64 %38, 100
%40 = load i64, i64* %7
%41 = load i64, i64* %11
%42 = sub nsw i64 %40, %41
%43 = icmp ugt i64 %39, %42
br i1 %43, label %44, label %46
44: ; preds = %37
%45 = load i64, i64* %7
store i64 %45, i64* %4
br label %413
46: ; preds = %37
%47 = load i64, i64* %11
%48 = load i64, i64* %8
%49 = mul i64 %48, 100
%50 = add i64 %47, %49
store i64 %50, i64* %4
br label %413
51: ; preds = %17
%52 = load i64, i64* %11
%53 = load i64, i64* %7
%54 = icmp sgt i64 %52, %53
br i1 %54, label %55, label %57
55: ; preds = %51
%56 = load i64, i64* %7
store i64 %56, i64* %4
br label %413
57: ; preds = %51
%58 = load i64, i64* %11
store i64 %58, i64* %4
br label %413
59: ; preds = %3
%60 = load i64, i64* %6
%61 = icmp ult i64 %60, -201
br i1 %61, label %62, label %119
62: ; preds = %59
%63 = load i64, i64* %5
%64 = load i64, i64* %6
%65 = udiv i64 %64, 200
%66 = sub i64 92233720368547758, %65
%67 = sub i64 %66, 1
%68 = icmp ult i64 %63, %67
br i1 %68, label %69, label %118
69: ; preds = %62
%70 = load i64, i64* %5
%71 = mul i64 100, %70
%72 = load i64, i64* %6
%73 = udiv i64 %72, 2
%74 = add i64 %71, %73
%75 = load i64, i64* %6
%76 = udiv i64 %74, %75
store i64 %76, i64* %12
%77 = load i64, i64* %8
%78 = icmp ne i64 %77, 0
br i1 %78, label %79, label %110
79: ; preds = %69
%80 = load i64, i64* %8
%81 = sub i64 %80, 1
%82 = load i64, i64* %7
%83 = sdiv i64 %82, 100
%84 = icmp ugt i64 %81, %83
br i1 %84, label %85, label %87
85: ; preds = %79
%86 = load i64, i64* %7
store i64 %86, i64* %4
br label %413
87: ; preds = %79
%88 = load i64, i64* %8
%89 = sub i64 %88, 1
%90 = mul i64 %89, 100
%91 = load i64, i64* %7
%92 = sub nsw i64 %91, 100
%93 = icmp ugt i64 %90, %92
br i1 %93, label %94, label %96
94: ; preds = %87
%95 = load i64, i64* %7
store i64 %95, i64* %4
br label %413
96: ; preds = %87
%97 = load i64, i64* %8
%98 = mul i64 %97, 100
%99 = load i64, i64* %7
%100 = load i64, i64* %12
%101 = sub nsw i64 %99, %100
%102 = icmp ugt i64 %98, %101
br i1 %102, label %103, label %105
103: ; preds = %96
%104 = load i64, i64* %7
store i64 %104, i64* %4
br label %413
105: ; preds = %96
%106 = load i64, i64* %12
%107 = load i64, i64* %8
%108 = mul i64 %107, 100
%109 = add i64 %106, %108
store i64 %109, i64* %4
br label %413
110: ; preds = %69
%111 = load i64, i64* %12
%112 = load i64, i64* %7
%113 = icmp sgt i64 %111, %112
br i1 %113, label %114, label %116
114: ; preds = %110
%115 = load i64, i64* %7
store i64 %115, i64* %4
br label %413
116: ; preds = %110
%117 = load i64, i64* %12
store i64 %117, i64* %4
br label %413
118: ; preds = %62
br label %119
119: ; preds = %118, %59
%120 = load i64, i64* %5
%121 = load i64, i64* %6
%122 = udiv i64 %121, 200
%123 = icmp ult i64 %120, %122
br i1 %123, label %124, label %166
124: ; preds = %119
store i64 0, i64* %13
%125 = load i64, i64* %8
%126 = icmp ne i64 %125, 0
br i1 %126, label %127, label %158
127: ; preds = %124
%128 = load i64, i64* %8
%129 = sub i64 %128, 1
%130 = load i64, i64* %7
%131 = sdiv i64 %130, 100
%132 = icmp ugt i64 %129, %131
br i1 %132, label %133, label %135
133: ; preds = %127
%134 = load i64, i64* %7
store i64 %134, i64* %4
br label %413
135: ; preds = %127
%136 = load i64, i64* %8
%137 = sub i64 %136, 1
%138 = mul i64 %137, 100
%139 = load i64, i64* %7
%140 = sub nsw i64 %139, 100
%141 = icmp ugt i64 %138, %140
br i1 %141, label %142, label %144
142: ; preds = %135
%143 = load i64, i64* %7
store i64 %143, i64* %4
br label %413
144: ; preds = %135
%145 = load i64, i64* %8
%146 = mul i64 %145, 100
%147 = load i64, i64* %7
%148 = load i64, i64* %13
%149 = sub nsw i64 %147, %148
%150 = icmp ugt i64 %146, %149
br i1 %150, label %151, label %153
151: ; preds = %144
%152 = load i64, i64* %7
store i64 %152, i64* %4
br label %413
153: ; preds = %144
%154 = load i64, i64* %13
%155 = load i64, i64* %8
%156 = mul i64 %155, 100
%157 = add i64 %154, %156
store i64 %157, i64* %4
br label %413
158: ; preds = %124
%159 = load i64, i64* %13
%160 = load i64, i64* %7
%161 = icmp sgt i64 %159, %160
br i1 %161, label %162, label %164
162: ; preds = %158
%163 = load i64, i64* %7
store i64 %163, i64* %4
br label %413
164: ; preds = %158
%165 = load i64, i64* %13
store i64 %165, i64* %4
br label %413
166: ; preds = %119
%167 = load i64, i64* %5
%168 = load i64, i64* %6
%169 = icmp uge i64 %167, %168
br i1 %169, label %170, label %179
170: ; preds = %166
%171 = load i64, i64* %5
%172 = load i64, i64* %6
%173 = udiv i64 %171, %172
store i64 %173, i64* %8
%174 = load i64, i64* %8
%175 = load i64, i64* %6
%176 = mul i64 %174, %175
%177 = load i64, i64* %5
%178 = sub i64 %177, %176
store i64 %178, i64* %5
br label %179
179: ; preds = %170, %166
store i64 0, i64* %10
%180 = load i64, i64* %5
store i64 %180, i64* %9
%181 = load i64, i64* %9
%182 = load i64, i64* %6
%183 = load i64, i64* %5
%184 = sub i64 %182, %183
%185 = icmp uge i64 %181, %184
br i1 %185, label %186, label %194
186: ; preds = %179
%187 = load i64, i64* %10
%188 = add i64 %187, 1
store i64 %188, i64* %10
%189 = load i64, i64* %6
%190 = load i64, i64* %5
%191 = sub i64 %189, %190
%192 = load i64, i64* %9
%193 = sub i64 %192, %191
store i64 %193, i64* %9
br label %198
194: ; preds = %179
%195 = load i64, i64* %5
%196 = load i64, i64* %9
%197 = add i64 %196, %195
store i64 %197, i64* %9
br label %198
198: ; preds = %194, %186
%199 = load i64, i64* %9
%200 = load i64, i64* %6
%201 = load i64, i64* %5
%202 = sub i64 %200, %201
%203 = icmp uge i64 %199, %202
br i1 %203, label %204, label %212
204: ; preds = %198
%205 = load i64, i64* %10
%206 = add i64 %205, 1
store i64 %206, i64* %10
%207 = load i64, i64* %6
%208 = load i64, i64* %5
%209 = sub i64 %207, %208
%210 = load i64, i64* %9
%211 = sub i64 %210, %209
store i64 %211, i64* %9
br label %216
212: ; preds = %198
%213 = load i64, i64* %5
%214 = load i64, i64* %9
%215 = add i64 %214, %213
store i64 %215, i64* %9
br label %216
216: ; preds = %212, %204
%217 = load i64, i64* %9
%218 = load i64, i64* %6
%219 = load i64, i64* %9
%220 = sub i64 %218, %219
%221 = icmp uge i64 %217, %220
br i1 %221, label %222, label %232
222: ; preds = %216
%223 = load i64, i64* %10
%224 = add i64 %223, 1
%225 = load i64, i64* %10
%226 = add i64 %225, %224
store i64 %226, i64* %10
%227 = load i64, i64* %6
%228 = load i64, i64* %9
%229 = sub i64 %227, %228
%230 = load i64, i64* %9
%231 = sub i64 %230, %229
store i64 %231, i64* %9
br label %239
232: ; preds = %216
%233 = load i64, i64* %10
%234 = load i64, i64* %10
%235 = add i64 %234, %233
store i64 %235, i64* %10
%236 = load i64, i64* %9
%237 = load i64, i64* %9
%238 = add i64 %237, %236
store i64 %238, i64* %9
br label %239
239: ; preds = %232, %222
%240 = load i64, i64* %9
%241 = load i64, i64* %6
%242 = load i64, i64* %9
%243 = sub i64 %241, %242
%244 = icmp uge i64 %240, %243
br i1 %244, label %245, label %255
245: ; preds = %239
%246 = load i64, i64* %10
%247 = add i64 %246, 1
%248 = load i64, i64* %10
%249 = add i64 %248, %247
store i64 %249, i64* %10
%250 = load i64, i64* %6
%251 = load i64, i64* %9
%252 = sub i64 %250, %251
%253 = load i64, i64* %9
%254 = sub i64 %253, %252
store i64 %254, i64* %9
br label %262
255: ; preds = %239
%256 = load i64, i64* %10
%257 = load i64, i64* %10
%258 = add i64 %257, %256
store i64 %258, i64* %10
%259 = load i64, i64* %9
%260 = load i64, i64* %9
%261 = add i64 %260, %259
store i64 %261, i64* %9
br label %262
262: ; preds = %255, %245
%263 = load i64, i64* %9
%264 = load i64, i64* %6
%265 = load i64, i64* %9
%266 = sub i64 %264, %265
%267 = icmp uge i64 %263, %266
br i1 %267, label %268, label %278
268: ; preds = %262
%269 = load i64, i64* %10
%270 = add i64 %269, 1
%271 = load i64, i64* %10
%272 = add i64 %271, %270
store i64 %272, i64* %10
%273 = load i64, i64* %6
%274 = load i64, i64* %9
%275 = sub i64 %273, %274
%276 = load i64, i64* %9
%277 = sub i64 %276, %275
store i64 %277, i64* %9
br label %285
278: ; preds = %262
%279 = load i64, i64* %10
%280 = load i64, i64* %10
%281 = add i64 %280, %279
store i64 %281, i64* %10
%282 = load i64, i64* %9
%283 = load i64, i64* %9
%284 = add i64 %283, %282
store i64 %284, i64* %9
br label %285
285: ; preds = %278, %268
%286 = load i64, i64* %9
%287 = load i64, i64* %6
%288 = load i64, i64* %5
%289 = sub i64 %287, %288
%290 = icmp uge i64 %286, %289
br i1 %290, label %291, label %299
291: ; preds = %285
%292 = load i64, i64* %10
%293 = add i64 %292, 1
store i64 %293, i64* %10
%294 = load i64, i64* %6
%295 = load i64, i64* %5
%296 = sub i64 %294, %295
%297 = load i64, i64* %9
%298 = sub i64 %297, %296
store i64 %298, i64* %9
br label %303
299: ; preds = %285
%300 = load i64, i64* %5
%301 = load i64, i64* %9
%302 = add i64 %301, %300
store i64 %302, i64* %9
br label %303
303: ; preds = %299, %291
%304 = load i64, i64* %9
%305 = load i64, i64* %6
%306 = load i64, i64* %9
%307 = sub i64 %305, %306
%308 = icmp uge i64 %304, %307
br i1 %308, label %309, label %319
309: ; preds = %303
%310 = load i64, i64* %10
%311 = add i64 %310, 1
%312 = load i64, i64* %10
%313 = add i64 %312, %311
store i64 %313, i64* %10
%314 = load i64, i64* %6
%315 = load i64, i64* %9
%316 = sub i64 %314, %315
%317 = load i64, i64* %9
%318 = sub i64 %317, %316
store i64 %318, i64* %9
br label %326
319: ; preds = %303
%320 = load i64, i64* %10
%321 = load i64, i64* %10
%322 = add i64 %321, %320
store i64 %322, i64* %10
%323 = load i64, i64* %9
%324 = load i64, i64* %9
%325 = add i64 %324, %323
store i64 %325, i64* %9
br label %326
326: ; preds = %319, %309
%327 = load i64, i64* %9
%328 = load i64, i64* %6
%329 = load i64, i64* %9
%330 = sub i64 %328, %329
%331 = icmp uge i64 %327, %330
br i1 %331, label %332, label %342
332: ; preds = %326
%333 = load i64, i64* %10
%334 = add i64 %333, 1
%335 = load i64, i64* %10
%336 = add i64 %335, %334
store i64 %336, i64* %10
%337 = load i64, i64* %6
%338 = load i64, i64* %9
%339 = sub i64 %337, %338
%340 = load i64, i64* %9
%341 = sub i64 %340, %339
store i64 %341, i64* %9
br label %349
342: ; preds = %326
%343 = load i64, i64* %10
%344 = load i64, i64* %10
%345 = add i64 %344, %343
store i64 %345, i64* %10
%346 = load i64, i64* %9
%347 = load i64, i64* %9
%348 = add i64 %347, %346
store i64 %348, i64* %9
br label %349
349: ; preds = %342, %332
%350 = load i64, i64* %9
%351 = load i64, i64* %6
%352 = load i64, i64* %6
%353 = udiv i64 %352, 2
%354 = sub i64 %351, %353
%355 = icmp uge i64 %350, %354
br i1 %355, label %356, label %365
356: ; preds = %349
%357 = load i64, i64* %10
%358 = add i64 %357, 1
store i64 %358, i64* %10
%359 = load i64, i64* %6
%360 = load i64, i64* %6
%361 = udiv i64 %360, 2
%362 = sub i64 %359, %361
%363 = load i64, i64* %9
%364 = sub i64 %363, %362
store i64 %364, i64* %9
br label %370
365: ; preds = %349
%366 = load i64, i64* %6
%367 = udiv i64 %366, 2
%368 = load i64, i64* %9
%369 = add i64 %368, %367
store i64 %369, i64* %9
br label %370
370: ; preds = %365, %356
%371 = load i64, i64* %10
store i64 %371, i64* %14
%372 = load i64, i64* %8
%373 = icmp ne i64 %372, 0
br i1 %373, label %374, label %405
374: ; preds = %370
%375 = load i64, i64* %8
%376 = sub i64 %375, 1
%377 = load i64, i64* %7
%378 = sdiv i64 %377, 100
%379 = icmp ugt i64 %376, %378
br i1 %379, label %380, label %382
380: ; preds = %374
%381 = load i64, i64* %7
store i64 %381, i64* %4
br label %413
382: ; preds = %374
%383 = load i64, i64* %8
%384 = sub i64 %383, 1
%385 = mul i64 %384, 100
%386 = load i64, i64* %7
%387 = sub nsw i64 %386, 100
%388 = icmp ugt i64 %385, %387
br i1 %388, label %389, label %391
389: ; preds = %382
%390 = load i64, i64* %7
store i64 %390, i64* %4
br label %413
391: ; preds = %382
%392 = load i64, i64* %8
%393 = mul i64 %392, 100
%394 = load i64, i64* %7
%395 = load i64, i64* %14
%396 = sub nsw i64 %394, %395
%397 = icmp ugt i64 %393, %396
br i1 %397, label %398, label %400
398: ; preds = %391
%399 = load i64, i64* %7
store i64 %399, i64* %4
br label %413
400: ; preds = %391
%401 = load i64, i64* %14
%402 = load i64, i64* %8
%403 = mul i64 %402, 100
%404 = add i64 %401, %403
store i64 %404, i64* %4
br label %413
405: ; preds = %370
%406 = load i64, i64* %14
%407 = load i64, i64* %7
%408 = icmp sgt i64 %406, %407
br i1 %408, label %409, label %411
409: ; preds = %405
%410 = load i64, i64* %7
store i64 %410, i64* %4
br label %413
411: ; preds = %405
%412 = load i64, i64* %14
store i64 %412, i64* %4
br label %413
413: ; preds = %411, %409, %400, %398, %389, %380, %164, %162, %153, %151, %142, %133, %116, %114, %105, %103, %94, %85, %57, %55, %46, %44, %35, %26
%414 = load i64, i64* %4
ret i64 %414
}

LLVM IR (-O2):
define i64 @percent(i64 %0, i64 %1, i64 %2) {
%4 = icmp eq i64 %1, 0
br i1 %4, label %5, label %8
5: ; preds = %3
%6 = icmp slt i64 %2, 100
%7 = select i1 %6, i64 %2, i64 100
br label %118
8: ; preds = %3
%9 = icmp ult i64 %1, -201
%10 = udiv i64 %1, 200
%11 = sub nuw nsw i64 92233720368547757, %10
%12 = icmp ugt i64 %11, %0
%13 = select i1 %9, i1 %12, i1 false
br i1 %13, label %14, label %21
14: ; preds = %8
%15 = mul i64 %0, 100
%16 = lshr i64 %1, 1
%17 = add i64 %16, %15
%18 = udiv i64 %17, %1
%19 = icmp sgt i64 %18, %2
%20 = select i1 %19, i64 %2, i64 %18
br label %118
21: ; preds = %8
%22 = icmp ugt i64 %10, %0
br i1 %22, label %23, label %26
23: ; preds = %21
%24 = icmp slt i64 %2, 0
%25 = select i1 %24, i64 %2, i64 0
br label %118
26: ; preds = %21
%27 = icmp ult i64 %0, %1
br i1 %27, label %32, label %28
28: ; preds = %26
%29 = udiv i64 %0, %1
%30 = mul i64 %29, %1
%31 = urem i64 %0, %1
br label %32
32: ; preds = %28, %26
%33 = phi i64 [ %29, %28 ], [ 0, %26 ]
%34 = phi i64 [ %31, %28 ], [ %0, %26 ]
%35 = sub i64 %1, %34
%36 = icmp ult i64 %34, %35
%37 = sub i64 %34, %35
%38 = shl i64 %34, 1
%39 = xor i1 %36, true
%40 = zext i1 %39 to i64
%41 = select i1 %36, i64 %38, i64 %37
%42 = icmp ult i64 %41, %35
%43 = select i1 %36, i64 1, i64 2
%44 = select i1 %42, i64 %40, i64 %43
%45 = sub i64 0, %35
%46 = select i1 %42, i64 %34, i64 %45
%47 = add i64 %46, %41
%48 = sub i64 %1, %47
%49 = icmp ult i64 %47, %48
%50 = sub i64 %47, %48
%51 = shl i64 %47, 1
%52 = select i1 %49, i64 %51, i64 %50
%53 = sub i64 %1, %52
%54 = icmp ult i64 %52, %53
%55 = shl nuw nsw i64 %44, 2
%56 = select i1 %49, i64 0, i64 2
%57 = or i64 %55, %56
%58 = sub i64 %52, %53
%59 = shl i64 %52, 1
%60 = xor i1 %54, true
%61 = zext i1 %60 to i64
%62 = or i64 %57, %61
%63 = select i1 %54, i64 %59, i64 %58
%64 = sub i64 %1, %63
%65 = icmp ult i64 %63, %64
%66 = shl nuw nsw i64 %62, 1
%67 = sub i64 %63, %64
%68 = shl i64 %63, 1
%69 = xor i1 %65, true
%70 = zext i1 %69 to i64
%71 = or i64 %66, %70
%72 = select i1 %65, i64 %68, i64 %67
%73 = icmp ult i64 %72, %35
%74 = xor i1 %73, true
%75 = zext i1 %74 to i64
%76 = add i64 %71, %75
%77 = select i1 %73, i64 %34, i64 %45
%78 = add i64 %77, %72
%79 = sub i64 %1, %78
%80 = icmp ult i64 %78, %79
%81 = sub i64 %78, %79
%82 = shl i64 %78, 1
%83 = select i1 %80, i64 %82, i64 %81
%84 = sub i64 %1, %83
%85 = icmp ult i64 %83, %84
%86 = shl i64 %76, 2
%87 = select i1 %80, i64 0, i64 2
%88 = or i64 %86, %87
%89 = sub i64 %83, %84
%90 = shl i64 %83, 1
%91 = xor i1 %85, true
%92 = zext i1 %91 to i64
%93 = or i64 %88, %92
%94 = select i1 %85, i64 %90, i64 %89
%95 = lshr i64 %1, 1
%96 = sub i64 %1, %95
%97 = icmp uge i64 %94, %96
%98 = zext i1 %97 to i64
%99 = add i64 %93, %98
%100 = icmp eq i64 %33, 0
br i1 %100, label %115, label %101
101: ; preds = %32
%102 = add i64 %33, -1
%103 = sdiv i64 %2, 100
%104 = icmp ugt i64 %102, %103
br i1 %104, label %118, label %105
105: ; preds = %101
%106 = mul i64 %102, 100
%107 = add nsw i64 %2, -100
%108 = icmp ugt i64 %106, %107
br i1 %108, label %118, label %109
109: ; preds = %105
%110 = mul i64 %33, 100
%111 = sub nsw i64 %2, %99
%112 = icmp ugt i64 %110, %111
%113 = add i64 %99, %110
%114 = select i1 %112, i64 %2, i64 %113
br label %118
115: ; preds = %32
%116 = icmp sgt i64 %99, %2
%117 = select i1 %116, i64 %2, i64 %99
br label %118
118: ; preds = %109, %101, %105, %115, %23, %14, %5
%119 = phi i64 [ %7, %5 ], [ %20, %14 ], [ %25, %23 ], [ %2, %101 ], [ %2, %105 ], [ %117, %115 ], [ %114, %109 ]
ret i64 %119
}