void i8253_cascade_ns_to_timer(int i8253_osc_base, unsigned int *d1,
                               unsigned int *d2, unsigned int *nanosec,
                               unsigned int flags) {
  unsigned int divider;
  unsigned int div1, div2;
  unsigned int div1_glb, div2_glb, ns_glb;
  unsigned int div1_lub, div2_lub, ns_lub;
  unsigned int ns;
  unsigned int start;
  unsigned int ns_low, ns_high;
  static const unsigned int max_count = 0x10000;
  div1 = *d1 ? *d1 : max_count;
  div2 = *d2 ? *d2 : max_count;
  divider = div1 * div2;
  if (div1 * div2 * i8253_osc_base == *nanosec && div1 > 1 &&
      div1 <= max_count && div2 > 1 && div2 <= max_count && divider > div1 &&
      divider > div2 && divider * i8253_osc_base > divider &&
      divider * i8253_osc_base > i8253_osc_base) {
    return;
  }
  divider = *nanosec / i8253_osc_base;
  div1_lub = div2_lub = 0;
  div1_glb = div2_glb = 0;
  ns_glb = 0;
  ns_lub = 0xffffffff;
  div2 = max_count;
  start = divider / div2;
  if (start < 2)
    start = 2;
  for (div1 = start; div1 <= divider / div1 + 1 && div1 <= max_count; div1++) {
    for (div2 = divider / div1;
         div1 * div2 <= divider + div1 + 1 && div2 <= max_count; div2++) {
      ns = i8253_osc_base * div1 * div2;
      if (ns <= *nanosec && ns > ns_glb) {
        ns_glb = ns;
        div1_glb = div1;
        div2_glb = div2;
      }
      if (ns >= *nanosec && ns < ns_lub) {
        ns_lub = ns;
        div1_lub = div1;
        div2_lub = div2;
      }
    }
  }
  switch (flags & 0x00030000) {
  case 0x00000000:
  default:
    ns_high = div1_lub * div2_lub * i8253_osc_base;
    ns_low = div1_glb * div2_glb * i8253_osc_base;
    if (ns_high - *nanosec < *nanosec - ns_low) {
      div1 = div1_lub;
      div2 = div2_lub;
    } else {
      div1 = div1_glb;
      div2 = div2_glb;
    }
    break;
  case 0x00020000:
    div1 = div1_lub;
    div2 = div2_lub;
    break;
  case 0x00010000:
    div1 = div1_glb;
    div2 = div2_glb;
    break;
  }
  *nanosec = div1 * div2 * i8253_osc_base;
  *d1 = div1 & 0xffff;
  *d2 = div2 & 0xffff;
}


x86 assembly (clang, -O0):
<i8253_cascade_ns_to_timer>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
je     1132 <i8253_cascade_ns_to_timer+0x32>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x5c(%rbp)
jmp    113f <i8253_cascade_ns_to_timer+0x3f>
mov    $0x10000,%eax
mov    %eax,-0x5c(%rbp)
jmp    113f <i8253_cascade_ns_to_timer+0x3f>
mov    -0x5c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
cmpl   $0x0,(%rax)
je     1160 <i8253_cascade_ns_to_timer+0x60>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x60(%rbp)
jmp    116d <i8253_cascade_ns_to_timer+0x6d>
mov    $0x10000,%eax
mov    %eax,-0x60(%rbp)
jmp    116d <i8253_cascade_ns_to_timer+0x6d>
mov    -0x60(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
imul   -0x30(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
imul   -0x30(%rbp),%eax
imul   -0x4(%rbp),%eax
mov    -0x20(%rbp),%rcx
cmp    (%rcx),%eax
jne    11ff <i8253_cascade_ns_to_timer+0xff>
cmpl   $0x1,-0x2c(%rbp)
jbe    11ff <i8253_cascade_ns_to_timer+0xff>
cmpl   $0x10000,-0x2c(%rbp)
ja     11ff <i8253_cascade_ns_to_timer+0xff>
cmpl   $0x1,-0x30(%rbp)
jbe    11ff <i8253_cascade_ns_to_timer+0xff>
cmpl   $0x10000,-0x30(%rbp)
ja     11ff <i8253_cascade_ns_to_timer+0xff>
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jbe    11ff <i8253_cascade_ns_to_timer+0xff>
mov    -0x28(%rbp),%eax
cmp    -0x30(%rbp),%eax
jbe    11ff <i8253_cascade_ns_to_timer+0xff>
mov    -0x28(%rbp),%eax
imul   -0x4(%rbp),%eax
cmp    -0x28(%rbp),%eax
jbe    11ff <i8253_cascade_ns_to_timer+0xff>
mov    -0x28(%rbp),%eax
imul   -0x4(%rbp),%eax
cmp    -0x4(%rbp),%eax
jbe    11ff <i8253_cascade_ns_to_timer+0xff>
jmp    1452 <i8253_cascade_ns_to_timer+0x352>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
xor    %edx,%edx
divl   -0x4(%rbp)
mov    %eax,-0x28(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0xffffffff,-0x48(%rbp)
movl   $0x10000,-0x30(%rbp)
mov    -0x28(%rbp),%eax
xor    %edx,%edx
divl   -0x30(%rbp)
mov    %eax,-0x50(%rbp)
cmpl   $0x2,-0x50(%rbp)
jae    125a <i8253_cascade_ns_to_timer+0x15a>
movl   $0x2,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%eax
xor    %edx,%edx
divl   -0x2c(%rbp)
mov    %eax,%edx
add    $0x1,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x61(%rbp)
ja     128a <i8253_cascade_ns_to_timer+0x18a>
cmpl   $0x10000,-0x2c(%rbp)
setbe  %al
mov    %al,-0x61(%rbp)
mov    -0x61(%rbp),%al
test   $0x1,%al
jne    129a <i8253_cascade_ns_to_timer+0x19a>
jmp    136d <i8253_cascade_ns_to_timer+0x26d>
mov    -0x28(%rbp),%eax
xor    %edx,%edx
divl   -0x2c(%rbp)
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%ecx
imul   -0x30(%rbp),%ecx
mov    -0x28(%rbp),%edx
add    -0x2c(%rbp),%edx
add    $0x1,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x62(%rbp)
ja     12cf <i8253_cascade_ns_to_timer+0x1cf>
cmpl   $0x10000,-0x30(%rbp)
setbe  %al
mov    %al,-0x62(%rbp)
mov    -0x62(%rbp),%al
test   $0x1,%al
jne    12df <i8253_cascade_ns_to_timer+0x1df>
jmp    135a <i8253_cascade_ns_to_timer+0x25a>
mov    -0x4(%rbp),%eax
imul   -0x2c(%rbp),%eax
imul   -0x30(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    -0x20(%rbp),%rcx
cmp    (%rcx),%eax
ja     131a <i8253_cascade_ns_to_timer+0x21a>
mov    -0x4c(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jbe    131a <i8253_cascade_ns_to_timer+0x21a>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x4c(%rbp),%eax
mov    -0x20(%rbp),%rcx
cmp    (%rcx),%eax
jb     1347 <i8253_cascade_ns_to_timer+0x247>
mov    -0x4c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jae    1347 <i8253_cascade_ns_to_timer+0x247>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    134c <i8253_cascade_ns_to_timer+0x24c>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    12a5 <i8253_cascade_ns_to_timer+0x1a5>
jmp    135f <i8253_cascade_ns_to_timer+0x25f>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1260 <i8253_cascade_ns_to_timer+0x160>
mov    -0x24(%rbp),%eax
and    $0x30000,%eax
mov    %eax,-0x68(%rbp)
je     13a9 <i8253_cascade_ns_to_timer+0x2a9>
jmp    1383 <i8253_cascade_ns_to_timer+0x283>
mov    -0x68(%rbp),%eax
sub    $0x10000,%eax
je     1417 <i8253_cascade_ns_to_timer+0x317>
jmp    1396 <i8253_cascade_ns_to_timer+0x296>
mov    -0x68(%rbp),%eax
sub    $0x20000,%eax
je     1406 <i8253_cascade_ns_to_timer+0x306>
jmp    13ae <i8253_cascade_ns_to_timer+0x2ae>
jmp    13ae <i8253_cascade_ns_to_timer+0x2ae>
mov    -0x40(%rbp),%eax
imul   -0x44(%rbp),%eax
imul   -0x4(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x34(%rbp),%eax
imul   -0x38(%rbp),%eax
imul   -0x4(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x58(%rbp),%eax
mov    -0x20(%rbp),%rcx
sub    (%rcx),%eax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%ecx
sub    -0x54(%rbp),%ecx
cmp    %ecx,%eax
jae    13f5 <i8253_cascade_ns_to_timer+0x2f5>
mov    -0x40(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x44(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1401 <i8253_cascade_ns_to_timer+0x301>
mov    -0x34(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1423 <i8253_cascade_ns_to_timer+0x323>
mov    -0x40(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x44(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1423 <i8253_cascade_ns_to_timer+0x323>
mov    -0x34(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%ecx
imul   -0x30(%rbp),%ecx
imul   -0x4(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x2c(%rbp),%ecx
and    $0xffff,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x30(%rbp),%ecx
and    $0xffff,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<i8253_cascade_ns_to_timer>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    (%rsi),%ebx
test   %ebx,%ebx
mov    $0x10000,%ebp
cmove  %ebp,%ebx
mov    (%rdx),%eax
test   %eax,%eax
cmove  %ebp,%eax
mov    %eax,%ebp
imul   %ebx,%ebp
mov    %ebp,%r9d
imul   %edi,%r9d
mov    (%rcx),%r10d
mov    %r10d,-0x40(%rsp)
cmp    %r10d,%r9d
jne    1165 <i8253_cascade_ns_to_timer+0x65>
cmp    $0x2,%ebx
jb     1165 <i8253_cascade_ns_to_timer+0x65>
cmp    $0x10000,%ebx
ja     1165 <i8253_cascade_ns_to_timer+0x65>
cmp    $0x2,%eax
jb     1165 <i8253_cascade_ns_to_timer+0x65>
cmp    $0x10000,%eax
ja     1165 <i8253_cascade_ns_to_timer+0x65>
cmp    %ebx,%ebp
jbe    1165 <i8253_cascade_ns_to_timer+0x65>
cmp    %eax,%ebp
jbe    1165 <i8253_cascade_ns_to_timer+0x65>
cmp    %ebp,%r9d
jbe    1165 <i8253_cascade_ns_to_timer+0x65>
cmp    %edi,%r9d
ja     1397 <i8253_cascade_ns_to_timer+0x297>
mov    %r8d,-0x14(%rsp)
mov    %rcx,-0x30(%rsp)
mov    %rsi,-0x28(%rsp)
mov    %rdx,-0x20(%rsp)
xor    %r11d,%r11d
mov    -0x40(%rsp),%eax
xor    %edx,%edx
mov    %edi,-0x44(%rsp)
div    %edi
mov    %eax,%ecx
shr    $0x10,%ecx
cmp    $0x3,%ecx
mov    $0x2,%esi
cmovae %ecx,%esi
mov    %rax,%rcx
mov    %rax,-0x8(%rsp)
xor    %edx,%edx
div    %esi
lea    0x1(%rax),%ecx
mov    $0x0,%r12d
mov    $0x0,%r13d
mov    $0x0,%r8d
cmp    %ecx,%esi
ja     1314 <i8253_cascade_ns_to_timer+0x214>
mov    $0xffffffff,%r15d
xor    %r8d,%r8d
xor    %r13d,%r13d
xor    %r12d,%r12d
xor    %r9d,%r9d
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
lea    0x1(%rsi),%ecx
cmp    $0x10000,%eax
mov    %ecx,-0x10(%rsp)
ja     12c0 <i8253_cascade_ns_to_timer+0x1c0>
mov    -0x8(%rsp),%rcx
lea    (%rsi,%rcx,1),%edx
add    $0x1,%edx
mov    %eax,%ecx
mov    %rsi,-0x38(%rsp)
imul   %esi,%ecx
mov    %edx,-0xc(%rsp)
cmp    %edx,%ecx
ja     12d0 <i8253_cascade_ns_to_timer+0x1d0>
mov    %r8d,%r10d
mov    %r15d,%r14d
mov    %r13d,%edi
mov    %r9d,%r13d
mov    %r11d,%ecx
mov    -0x38(%rsp),%rsi
nopw   0x0(%rax,%rax,1)
mov    %eax,%r15d
imul   %esi,%r15d
imul   -0x44(%rsp),%r15d
cmp    %r13d,%r15d
seta   %bl
cmp    -0x40(%rsp),%r15d
setbe  %dl
setae  %r11b
mov    %eax,%ebp
mov    %eax,-0x3c(%rsp)
mov    %r15d,%r9d
mov    %esi,%r8d
test   %bl,%dl
jne    1269 <i8253_cascade_ns_to_timer+0x169>
mov    %ecx,-0x3c(%rsp)
mov    %r13d,%r9d
mov    %r10d,%r8d
cmp    %r14d,%r15d
setb   %cl
mov    %esi,%ebx
mov    %eax,%ebp
test   %cl,%r11b
jne    1280 <i8253_cascade_ns_to_timer+0x180>
mov    %r12d,%ebx
mov    %edi,%ebp
mov    %r14d,%r15d
cmp    $0xffff,%eax
ja     12e0 <i8253_cascade_ns_to_timer+0x1e0>
add    $0x1,%eax
mov    %eax,%edx
mov    -0x38(%rsp),%rsi
imul   %esi,%edx
mov    %r8d,%r10d
mov    %r15d,%r14d
mov    %ebp,%edi
mov    %ebx,%r12d
mov    %r9d,%r13d
mov    -0x3c(%rsp),%r11d
mov    %r11d,%ecx
cmp    -0xc(%rsp),%edx
jbe    1230 <i8253_cascade_ns_to_timer+0x130>
jmp    12ea <i8253_cascade_ns_to_timer+0x1ea>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r12d,%ebx
mov    %r13d,%ebp
jmp    12ea <i8253_cascade_ns_to_timer+0x1ea>
nopl   0x0(%rax,%rax,1)
mov    %r12d,%ebx
mov    %r13d,%ebp
jmp    12e5 <i8253_cascade_ns_to_timer+0x1e5>
nopl   0x0(%rax,%rax,1)
mov    -0x3c(%rsp),%r11d
mov    -0x38(%rsp),%rsi
mov    %ebp,%r13d
mov    %ebx,%r12d
mov    -0x8(%rsp),%rax
xor    %edx,%edx
mov    -0x10(%rsp),%edi
div    %edi
cmp    $0xffff,%esi
ja     1314 <i8253_cascade_ns_to_timer+0x214>
mov    %eax,%ecx
add    $0x1,%ecx
cmp    %ecx,%esi
mov    %edi,%esi
jb     11e0 <i8253_cascade_ns_to_timer+0xe0>
mov    -0x14(%rsp),%eax
and    $0x30000,%eax
cmp    $0x10000,%eax
je     1337 <i8253_cascade_ns_to_timer+0x237>
cmp    $0x20000,%eax
mov    -0x44(%rsp),%esi
jne    134c <i8253_cascade_ns_to_timer+0x24c>
mov    %r13d,%r11d
mov    %r12d,%r8d
jmp    1372 <i8253_cascade_ns_to_timer+0x272>
mov    -0x20(%rsp),%rcx
mov    -0x28(%rsp),%rdx
mov    -0x30(%rsp),%rax
mov    -0x44(%rsp),%esi
jmp    1381 <i8253_cascade_ns_to_timer+0x281>
mov    %r12d,%eax
imul   %esi,%eax
imul   %r13d,%eax
mov    %r11d,%ecx
imul   %esi,%ecx
imul   %r8d,%ecx
mov    -0x40(%rsp),%edx
sub    %edx,%eax
sub    %ecx,%edx
cmp    %edx,%eax
cmovb  %r13d,%r11d
cmovb  %r12d,%r8d
mov    -0x20(%rsp),%rcx
mov    -0x28(%rsp),%rdx
mov    -0x30(%rsp),%rax
imul   %r11d,%esi
imul   %r8d,%esi
mov    %esi,(%rax)
movzwl %r8w,%eax
mov    %eax,(%rdx)
movzwl %r11w,%eax
mov    %eax,(%rcx)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@i8253_cascade_ns_to_timer.max_count = internal constant i32 65536
define void @i8253_cascade_ns_to_timer(i32 %0, i32* %1, i32* %2, i32* %3, i32 %4) {
%6 = alloca i32
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
store i32 %0, i32* %6
store i32* %1, i32** %7
store i32* %2, i32** %8
store i32* %3, i32** %9
store i32 %4, i32* %10
%24 = load i32*, i32** %7
%25 = load i32, i32* %24
%26 = icmp ne i32 %25, 0
br i1 %26, label %27, label %30
27: ; preds = %5
%28 = load i32*, i32** %7
%29 = load i32, i32* %28
br label %31
30: ; preds = %5
br label %31
31: ; preds = %30, %27
%32 = phi i32 [ %29, %27 ], [ 65536, %30 ]
store i32 %32, i32* %12
%33 = load i32*, i32** %8
%34 = load i32, i32* %33
%35 = icmp ne i32 %34, 0
br i1 %35, label %36, label %39
36: ; preds = %31
%37 = load i32*, i32** %8
%38 = load i32, i32* %37
br label %40
39: ; preds = %31
br label %40
40: ; preds = %39, %36
%41 = phi i32 [ %38, %36 ], [ 65536, %39 ]
store i32 %41, i32* %13
%42 = load i32, i32* %12
%43 = load i32, i32* %13
%44 = mul i32 %42, %43
store i32 %44, i32* %11
%45 = load i32, i32* %12
%46 = load i32, i32* %13
%47 = mul i32 %45, %46
%48 = load i32, i32* %6
%49 = mul i32 %47, %48
%50 = load i32*, i32** %9
%51 = load i32, i32* %50
%52 = icmp eq i32 %49, %51
br i1 %52, label %53, label %86
53: ; preds = %40
%54 = load i32, i32* %12
%55 = icmp ugt i32 %54, 1
br i1 %55, label %56, label %86
56: ; preds = %53
%57 = load i32, i32* %12
%58 = icmp ule i32 %57, 65536
br i1 %58, label %59, label %86
59: ; preds = %56
%60 = load i32, i32* %13
%61 = icmp ugt i32 %60, 1
br i1 %61, label %62, label %86
62: ; preds = %59
%63 = load i32, i32* %13
%64 = icmp ule i32 %63, 65536
br i1 %64, label %65, label %86
65: ; preds = %62
%66 = load i32, i32* %11
%67 = load i32, i32* %12
%68 = icmp ugt i32 %66, %67
br i1 %68, label %69, label %86
69: ; preds = %65
%70 = load i32, i32* %11
%71 = load i32, i32* %13
%72 = icmp ugt i32 %70, %71
br i1 %72, label %73, label %86
73: ; preds = %69
%74 = load i32, i32* %11
%75 = load i32, i32* %6
%76 = mul i32 %74, %75
%77 = load i32, i32* %11
%78 = icmp ugt i32 %76, %77
br i1 %78, label %79, label %86
79: ; preds = %73
%80 = load i32, i32* %11
%81 = load i32, i32* %6
%82 = mul i32 %80, %81
%83 = load i32, i32* %6
%84 = icmp ugt i32 %82, %83
br i1 %84, label %85, label %86
85: ; preds = %79
br label %218
86: ; preds = %79, %73, %69, %65, %62, %59, %56, %53, %40
%87 = load i32*, i32** %9
%88 = load i32, i32* %87
%89 = load i32, i32* %6
%90 = udiv i32 %88, %89
store i32 %90, i32* %11
store i32 0, i32* %18
store i32 0, i32* %17
store i32 0, i32* %15
store i32 0, i32* %14
store i32 0, i32* %16
store i32 -1, i32* %19
store i32 65536, i32* %13
%91 = load i32, i32* %11
%92 = load i32, i32* %13
%93 = udiv i32 %91, %92
store i32 %93, i32* %21
%94 = load i32, i32* %21
%95 = icmp ult i32 %94, 2
br i1 %95, label %96, label %97
96: ; preds = %86
store i32 2, i32* %21
br label %97
97: ; preds = %96, %86
%98 = load i32, i32* %21
store i32 %98, i32* %12
br label %99
99: ; preds = %165, %97
%100 = load i32, i32* %12
%101 = load i32, i32* %11
%102 = load i32, i32* %12
%103 = udiv i32 %101, %102
%104 = add i32 %103, 1
%105 = icmp ule i32 %100, %104
br i1 %105, label %106, label %109
106: ; preds = %99
%107 = load i32, i32* %12
%108 = icmp ule i32 %107, 65536
br label %109
109: ; preds = %106, %99
%110 = phi i1 [ false, %99 ], [ %108, %106 ]
br i1 %110, label %111, label %168
111: ; preds = %109
%112 = load i32, i32* %11
%113 = load i32, i32* %12
%114 = udiv i32 %112, %113
store i32 %114, i32* %13
br label %115
115: ; preds = %161, %111
%116 = load i32, i32* %12
%117 = load i32, i32* %13
%118 = mul i32 %116, %117
%119 = load i32, i32* %11
%120 = load i32, i32* %12
%121 = add i32 %119, %120
%122 = add i32 %121, 1
%123 = icmp ule i32 %118, %122
br i1 %123, label %124, label %127
124: ; preds = %115
%125 = load i32, i32* %13
%126 = icmp ule i32 %125, 65536
br label %127
127: ; preds = %124, %115
%128 = phi i1 [ false, %115 ], [ %126, %124 ]
br i1 %128, label %129, label %164
129: ; preds = %127
%130 = load i32, i32* %6
%131 = load i32, i32* %12
%132 = mul i32 %130, %131
%133 = load i32, i32* %13
%134 = mul i32 %132, %133
store i32 %134, i32* %20
%135 = load i32, i32* %20
%136 = load i32*, i32** %9
%137 = load i32, i32* %136
%138 = icmp ule i32 %135, %137
br i1 %138, label %139, label %147
139: ; preds = %129
%140 = load i32, i32* %20
%141 = load i32, i32* %16
%142 = icmp ugt i32 %140, %141
br i1 %142, label %143, label %147
143: ; preds = %139
%144 = load i32, i32* %20
store i32 %144, i32* %16
%145 = load i32, i32* %12
store i32 %145, i32* %14
%146 = load i32, i32* %13
store i32 %146, i32* %15
br label %147
147: ; preds = %143, %139, %129
%148 = load i32, i32* %20
%149 = load i32*, i32** %9
%150 = load i32, i32* %149
%151 = icmp uge i32 %148, %150
br i1 %151, label %152, label %160
152: ; preds = %147
%153 = load i32, i32* %20
%154 = load i32, i32* %19
%155 = icmp ult i32 %153, %154
br i1 %155, label %156, label %160
156: ; preds = %152
%157 = load i32, i32* %20
store i32 %157, i32* %19
%158 = load i32, i32* %12
store i32 %158, i32* %17
%159 = load i32, i32* %13
store i32 %159, i32* %18
br label %160
160: ; preds = %156, %152, %147
br label %161
161: ; preds = %160
%162 = load i32, i32* %13
%163 = add i32 %162, 1
store i32 %163, i32* %13
br label %115
164: ; preds = %127
br label %165
165: ; preds = %164
%166 = load i32, i32* %12
%167 = add i32 %166, 1
store i32 %167, i32* %12
br label %99
168: ; preds = %109
%169 = load i32, i32* %10
%170 = and i32 %169, 196608
switch i32 %170, label %172 [
i32 0, label %171
i32 131072, label %199
i32 65536, label %202
]
171: ; preds = %168
br label %172
172: ; preds = %168, %171
%173 = load i32, i32* %17
%174 = load i32, i32* %18
%175 = mul i32 %173, %174
%176 = load i32, i32* %6
%177 = mul i32 %175, %176
store i32 %177, i32* %23
%178 = load i32, i32* %14
%179 = load i32, i32* %15
%180 = mul i32 %178, %179
%181 = load i32, i32* %6
%182 = mul i32 %180, %181
store i32 %182, i32* %22
%183 = load i32, i32* %23
%184 = load i32*, i32** %9
%185 = load i32, i32* %184
%186 = sub i32 %183, %185
%187 = load i32*, i32** %9
%188 = load i32, i32* %187
%189 = load i32, i32* %22
%190 = sub i32 %188, %189
%191 = icmp ult i32 %186, %190
br i1 %191, label %192, label %195
192: ; preds = %172
%193 = load i32, i32* %17
store i32 %193, i32* %12
%194 = load i32, i32* %18
store i32 %194, i32* %13
br label %198
195: ; preds = %172
%196 = load i32, i32* %14
store i32 %196, i32* %12
%197 = load i32, i32* %15
store i32 %197, i32* %13
br label %198
198: ; preds = %195, %192
br label %205
199: ; preds = %168
%200 = load i32, i32* %17
store i32 %200, i32* %12
%201 = load i32, i32* %18
store i32 %201, i32* %13
br label %205
202: ; preds = %168
%203 = load i32, i32* %14
store i32 %203, i32* %12
%204 = load i32, i32* %15
store i32 %204, i32* %13
br label %205
205: ; preds = %202, %199, %198
%206 = load i32, i32* %12
%207 = load i32, i32* %13
%208 = mul i32 %206, %207
%209 = load i32, i32* %6
%210 = mul i32 %208, %209
%211 = load i32*, i32** %9
store i32 %210, i32* %211
%212 = load i32, i32* %12
%213 = and i32 %212, 65535
%214 = load i32*, i32** %7
store i32 %213, i32* %214
%215 = load i32, i32* %13
%216 = and i32 %215, 65535
%217 = load i32*, i32** %8
store i32 %216, i32* %217
br label %218
218: ; preds = %205, %85
ret void
}

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