int flt_difference(a, bh, bl, ch, cl)
unsigned int *a;
unsigned int bh;
unsigned int bl;
unsigned int ch;
unsigned int cl;
{
  unsigned int bg = 0, cg = 0, w, resultsign;
  int bx, cx;
  int shift;
  bx = (bh >> 20) & 0x7ff;
  cx = (ch >> 20) & 0x7ff;
  shift = bx - cx;
  if (shift < -54 || bx == 0) {
    a[0] = ch ^ 0x80000000;
    a[1] = cl;
    return 1;
  }
  if (shift > 54 || cx == 0) {
    a[0] = bh;
    a[1] = bl;
    return 1;
  }
  bh = (bh & 0xfffff) | 0x100000;
  ch = (ch & 0xfffff) | 0x100000;
  if (shift > 0) {
    int rshift;
    if (shift > 32) {
      cg = cl;
      cl = ch;
      ch = 0;
      shift -= 32;
    }
    rshift = 32 - shift;
    if (cg == 0)
      cg = cl << rshift;
    else
      cg = (cl << rshift) | 1;
    cl = (ch << rshift) | (cl >> shift);
    ch = ch >> shift;
    bg = 0;
  } else if (shift < 0) {
    int rshift;
    if (shift < -32) {
      bg = bl;
      bl = bh;
      bh = 0;
      shift += 32;
    }
    shift = -shift;
    rshift = 32 - shift;
    if (bg == 0)
      bg = bl << rshift;
    else
      bg = (bl << rshift) | 1;
    bl = (bh << rshift) | (bl >> shift);
    bh = bh >> shift;
    cg = 0;
    bx = cx;
  } else
    bg = cg = 0;
  w = (bg & 0xff) - (cg & 0xff);
  bg = (bg >> 8) - (cg >> 8) + (((int)w) >> 8);
  cg = ((int)bg) >> 24;
  bg = (bg << 8) | (w & 0xff);
  w = (bl & 0xff) - (cl & 0xff) + cg;
  bl = (bl >> 8) - (cl >> 8) + (((int)w) >> 8);
  cg = ((int)bl) >> 24;
  bl = (bl << 8) | (w & 0xff);
  bh = bh - ch + cg;
  if (bh & 0x80000000) {
    if (bg == 0) {
      if (bl == 0)
        bh = -bh;
      else {
        bl = -bl;
        bh = ~bh;
      }
    } else {
      bg = -bg;
      bl = ~bl;
      bh = ~bh;
    }
    resultsign = 0x80000000;
  } else
    resultsign = 0;
  if (bh == 0 && bl == 0 && bg == 0) {
    a[0] = a[1] = 0;
    return 1;
  }
  if ((bh & 0x00300000) == 0) {
    while (bh == 0) {
      bh = bl >> 11;
      bl = (bl << 21) | (bg >> 11);
      bg = bg << 21;
      bx -= 21;
      if (bx <= 0) {
        a[0] = a[1] = 0;
        return 1;
      }
    }
    while ((bh & 0x001fe000) == 0) {
      bh = (bh << 8) | (bl >> 24);
      bl = (bl << 8) | (bg >> 24);
      bg = bg << 8;
      bx -= 8;
      if (bx <= 0) {
        a[0] = a[1] = 0;
        return 1;
      }
    }
    while ((bh & 0x001c0000) == 0) {
      bh = (bh << 3) | (bl >> 29);
      bl = (bl << 3) | (bg >> 29);
      bg = bg << 3;
      bx -= 3;
      if (bx <= 0) {
        a[0] = a[1] = 0;
        return 1;
      }
    }
    while ((bh & 0x00100000) == 0) {
      bh = (bh << 1) | (bl >> 31);
      bl = (bl << 1) | (bg >> 31);
      bg = bg << 1;
      bx -= 1;
      if (bx <= 0) {
        a[0] = a[1] = 0;
        return 1;
      }
    }
  } else if (bh & 0x00200000) {
    bg = (bl << 31) | (bg >> 1);
    bl = (bh << 31) | (bl >> 1);
    bh = bh >> 1;
    bx += 1;
    if (bx >= 0x7ff)
      return 0;
  }
  if ((bg & 0x80000000) && ((bl & 1) != 0 || bg != 0x80000000)) {
    if (bl == 0xffffffff) {
      bl = 0;
      bh += 1;
      if (bh & 0x00200000) {
        bh = 0x00100000;
        bx += 1;
        if (bx >= 0x7ff)
          return 0;
      }
    } else
      bl += 1;
  }
  a[0] = (bh & ~0x00100000) | (bx << 20) | resultsign;
  a[1] = bl;
  return 1;
}


x86 assembly (clang, -O0):
<flt_difference>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
shr    $0x14,%eax
and    $0x7ff,%eax
mov    %eax,-0x34(%rbp)
mov    -0x1c(%rbp),%eax
shr    $0x14,%eax
and    $0x7ff,%eax
mov    %eax,-0x38(%rbp)
mov    -0x34(%rbp),%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0xffffffca,-0x3c(%rbp)
jl     115c <flt_difference+0x5c>
cmpl   $0x0,-0x34(%rbp)
jne    1181 <flt_difference+0x81>
mov    -0x1c(%rbp),%ecx
xor    $0x80000000,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
movl   $0x1,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
cmpl   $0x36,-0x3c(%rbp)
jg     1195 <flt_difference+0x95>
cmpl   $0x0,-0x38(%rbp)
jne    11b4 <flt_difference+0xb4>
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
movl   $0x1,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
mov    -0x14(%rbp),%eax
and    $0xfffff,%eax
or     $0x100000,%eax
mov    %eax,-0x14(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xfffff,%eax
or     $0x100000,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jle    1265 <flt_difference+0x165>
cmpl   $0x20,-0x3c(%rbp)
jle    1204 <flt_difference+0x104>
mov    -0x20(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x3c(%rbp),%eax
sub    $0x20,%eax
mov    %eax,-0x3c(%rbp)
mov    $0x20,%eax
sub    -0x3c(%rbp),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    1229 <flt_difference+0x129>
mov    -0x20(%rbp),%eax
mov    -0x40(%rbp),%ecx
shl    %cl,%eax
mov    %eax,-0x28(%rbp)
jmp    1237 <flt_difference+0x137>
mov    -0x20(%rbp),%eax
mov    -0x40(%rbp),%ecx
shl    %cl,%eax
or     $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x40(%rbp),%ecx
shl    %cl,%eax
mov    -0x20(%rbp),%edx
mov    -0x3c(%rbp),%ecx
shr    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x3c(%rbp),%ecx
shr    %cl,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x24(%rbp)
jmp    1317 <flt_difference+0x217>
cmpl   $0x0,-0x3c(%rbp)
jge    1304 <flt_difference+0x204>
cmpl   $0xffffffe0,-0x3c(%rbp)
jge    1295 <flt_difference+0x195>
mov    -0x18(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x3c(%rbp)
xor    %eax,%eax
sub    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    $0x20,%eax
sub    -0x3c(%rbp),%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x24(%rbp)
jne    12c2 <flt_difference+0x1c2>
mov    -0x18(%rbp),%eax
mov    -0x44(%rbp),%ecx
shl    %cl,%eax
mov    %eax,-0x24(%rbp)
jmp    12d0 <flt_difference+0x1d0>
mov    -0x18(%rbp),%eax
mov    -0x44(%rbp),%ecx
shl    %cl,%eax
or     $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x44(%rbp),%ecx
shl    %cl,%eax
mov    -0x18(%rbp),%edx
mov    -0x3c(%rbp),%ecx
shr    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x3c(%rbp),%ecx
shr    %cl,%eax
mov    %eax,-0x14(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1312 <flt_difference+0x212>
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x24(%rbp)
jmp    1317 <flt_difference+0x217>
mov    -0x24(%rbp),%eax
and    $0xff,%eax
mov    -0x28(%rbp),%ecx
and    $0xff,%ecx
sub    %ecx,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x24(%rbp),%eax
shr    $0x8,%eax
mov    -0x28(%rbp),%ecx
shr    $0x8,%ecx
sub    %ecx,%eax
mov    -0x2c(%rbp),%ecx
sar    $0x8,%ecx
add    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
sar    $0x18,%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x8,%eax
mov    -0x2c(%rbp),%ecx
and    $0xff,%ecx
or     %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%eax
and    $0xff,%eax
mov    -0x20(%rbp),%ecx
and    $0xff,%ecx
sub    %ecx,%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x18(%rbp),%eax
shr    $0x8,%eax
mov    -0x20(%rbp),%ecx
shr    $0x8,%ecx
sub    %ecx,%eax
mov    -0x2c(%rbp),%ecx
sar    $0x8,%ecx
add    %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
sar    $0x18,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x8,%eax
mov    -0x2c(%rbp),%ecx
and    $0xff,%ecx
or     %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
sub    -0x1c(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
and    $0x80000000,%eax
cmp    $0x0,%eax
je     142c <flt_difference+0x32c>
cmpl   $0x0,-0x24(%rbp)
jne    1406 <flt_difference+0x306>
cmpl   $0x0,-0x18(%rbp)
jne    13f0 <flt_difference+0x2f0>
xor    %eax,%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    1401 <flt_difference+0x301>
xor    %eax,%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
xor    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1420 <flt_difference+0x320>
xor    %eax,%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%eax
xor    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
xor    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
movl   $0x80000000,-0x30(%rbp)
jmp    1433 <flt_difference+0x333>
movl   $0x0,-0x30(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1472 <flt_difference+0x372>
cmpl   $0x0,-0x18(%rbp)
jne    1472 <flt_difference+0x372>
cmpl   $0x0,-0x24(%rbp)
jne    1472 <flt_difference+0x372>
mov    -0x10(%rbp),%rax
movl   $0x0,0x4(%rax)
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
mov    -0x14(%rbp),%eax
and    $0x300000,%eax
cmp    $0x0,%eax
jne    1661 <flt_difference+0x561>
jmp    1488 <flt_difference+0x388>
cmpl   $0x0,-0x14(%rbp)
jne    14ee <flt_difference+0x3ee>
mov    -0x18(%rbp),%eax
shr    $0xb,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x15,%eax
mov    -0x24(%rbp),%ecx
shr    $0xb,%ecx
or     %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x15,%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x15,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jg     14e9 <flt_difference+0x3e9>
mov    -0x10(%rbp),%rax
movl   $0x0,0x4(%rax)
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
jmp    1488 <flt_difference+0x388>
jmp    14f3 <flt_difference+0x3f3>
mov    -0x14(%rbp),%eax
and    $0x1fe000,%eax
cmp    $0x0,%eax
jne    1568 <flt_difference+0x468>
mov    -0x14(%rbp),%eax
shl    $0x8,%eax
mov    -0x18(%rbp),%ecx
shr    $0x18,%ecx
or     %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x8,%eax
mov    -0x24(%rbp),%ecx
shr    $0x18,%ecx
or     %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x8,%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x8,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jg     1563 <flt_difference+0x463>
mov    -0x10(%rbp),%rax
movl   $0x0,0x4(%rax)
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
jmp    14f3 <flt_difference+0x3f3>
jmp    156d <flt_difference+0x46d>
mov    -0x14(%rbp),%eax
and    $0x1c0000,%eax
cmp    $0x0,%eax
jne    15e2 <flt_difference+0x4e2>
mov    -0x14(%rbp),%eax
shl    $0x3,%eax
mov    -0x18(%rbp),%ecx
shr    $0x1d,%ecx
or     %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x3,%eax
mov    -0x24(%rbp),%ecx
shr    $0x1d,%ecx
or     %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x3,%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jg     15dd <flt_difference+0x4dd>
mov    -0x10(%rbp),%rax
movl   $0x0,0x4(%rax)
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
jmp    156d <flt_difference+0x46d>
jmp    15e7 <flt_difference+0x4e7>
mov    -0x14(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
jne    165c <flt_difference+0x55c>
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    -0x18(%rbp),%ecx
shr    $0x1f,%ecx
or     %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x1,%eax
mov    -0x24(%rbp),%ecx
shr    $0x1f,%ecx
or     %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jg     1657 <flt_difference+0x557>
mov    -0x10(%rbp),%rax
movl   $0x0,0x4(%rax)
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
jmp    15e7 <flt_difference+0x4e7>
jmp    16c9 <flt_difference+0x5c9>
mov    -0x14(%rbp),%eax
and    $0x200000,%eax
cmp    $0x0,%eax
je     16c4 <flt_difference+0x5c4>
mov    -0x18(%rbp),%eax
shl    $0x1f,%eax
mov    -0x24(%rbp),%ecx
shr    $0x1,%ecx
or     %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x1f,%eax
mov    -0x18(%rbp),%ecx
shr    $0x1,%ecx
or     %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x7ff,-0x34(%rbp)
jl     16bf <flt_difference+0x5bf>
movl   $0x0,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
jmp    16c4 <flt_difference+0x5c4>
jmp    16c9 <flt_difference+0x5c9>
mov    -0x24(%rbp),%eax
and    $0x80000000,%eax
cmp    $0x0,%eax
je     1762 <flt_difference+0x662>
mov    -0x18(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    16f6 <flt_difference+0x5f6>
cmpl   $0x80000000,-0x24(%rbp)
je     1762 <flt_difference+0x662>
cmpl   $0xffffffff,-0x18(%rbp)
jne    1754 <flt_difference+0x654>
movl   $0x0,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
and    $0x200000,%eax
cmp    $0x0,%eax
je     174f <flt_difference+0x64f>
movl   $0x100000,-0x14(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x7ff,-0x34(%rbp)
jl     174a <flt_difference+0x64a>
movl   $0x0,-0x4(%rbp)
jmp    178d <flt_difference+0x68d>
jmp    174f <flt_difference+0x64f>
jmp    175d <flt_difference+0x65d>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1762 <flt_difference+0x662>
mov    -0x14(%rbp),%ecx
and    $0xffefffff,%ecx
mov    -0x34(%rbp),%eax
shl    $0x14,%eax
or     %eax,%ecx
or     -0x30(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<flt_difference>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    %ecx,%r9d
mov    %esi,%r14d
shr    $0x14,%r14d
and    $0x7ff,%r14d
je     117d <flt_difference+0x7d>
mov    %r9d,%ebp
shr    $0x14,%ebp
and    $0x7ff,%ebp
mov    %r14d,%eax
sub    %ebp,%eax
cmp    $0xffffffc9,%eax
jle    117d <flt_difference+0x7d>
test   %ebp,%ebp
je     1190 <flt_difference+0x90>
cmp    $0x37,%eax
jge    1190 <flt_difference+0x90>
and    $0xfffff,%esi
or     $0x100000,%esi
and    $0xfffff,%r9d
or     $0x100000,%r9d
test   %eax,%eax
jle    119a <flt_difference+0x9a>
cmp    $0x20,%eax
jbe    11a5 <flt_difference+0xa5>
lea    -0x20(%rax),%r11d
mov    $0x40,%r10d
sub    %eax,%r10d
neg    %eax
mov    %r9d,%ebx
mov    %eax,%ecx
shl    %cl,%ebx
xor    %ebp,%ebp
test   %r8d,%r8d
je     11f0 <flt_difference+0xf0>
or     $0x1,%ebx
jmp    11f6 <flt_difference+0xf6>
xor    $0x80000000,%r9d
mov    %r9d,(%rdi)
mov    %r8d,0x4(%rdi)
jmp    1439 <flt_difference+0x339>
mov    %esi,(%rdi)
mov    %edx,0x4(%rdi)
jmp    1439 <flt_difference+0x339>
xor    %ebx,%ebx
test   %eax,%eax
js     11bf <flt_difference+0xbf>
xor    %r15d,%r15d
jmp    1211 <flt_difference+0x111>
mov    $0x20,%r10d
sub    %eax,%r10d
mov    %eax,%ecx
neg    %ecx
mov    %r8d,%ebx
shl    %cl,%ebx
mov    %r9d,%ebp
mov    %r8d,%r9d
jmp    11f3 <flt_difference+0xf3>
cmp    $0xffffffe0,%eax
jae    12f9 <flt_difference+0x1f9>
mov    $0xffffffe0,%r10d
mov    %esi,%r15d
mov    %eax,%ecx
shl    %cl,%r15d
sub    %eax,%r10d
lea    0x40(%rax),%r11d
xor    %eax,%eax
test   %edx,%edx
je     130f <flt_difference+0x20f>
or     $0x1,%r15d
jmp    130f <flt_difference+0x20f>
mov    %r11d,%eax
mov    %eax,%r11d
mov    %ebp,%eax
mov    %r10d,%ecx
shl    %cl,%eax
mov    %r11d,%ecx
shr    %cl,%r9d
or     %eax,%r9d
shr    %cl,%ebp
xor    %r15d,%r15d
mov    %r9d,%r8d
mov    %ebp,%r9d
sub    %r9d,%esi
movzbl %r15b,%eax
movzbl %bl,%ecx
sub    %ecx,%eax
shr    $0x8,%r15d
shr    $0x8,%ebx
sub    %ebx,%r15d
movzbl %al,%ebx
sar    $0x8,%eax
add    %r15d,%eax
mov    %eax,%ecx
sar    $0x18,%ecx
shl    $0x8,%eax
or     %eax,%ebx
movzbl %dl,%eax
movzbl %r8b,%ebp
sub    %ebp,%eax
add    %ecx,%eax
shr    $0x8,%edx
shr    $0x8,%r8d
sub    %r8d,%edx
movzbl %al,%ecx
sar    $0x8,%eax
add    %edx,%eax
mov    %eax,%edx
sar    $0x18,%edx
shl    $0x8,%eax
or     %eax,%ecx
add    %esi,%edx
js     127f <flt_difference+0x17f>
xor    %esi,%esi
test   %edx,%edx
jne    129e <flt_difference+0x19e>
test   %ecx,%ecx
jne    129e <flt_difference+0x19e>
test   %ebx,%ebx
jne    129e <flt_difference+0x19e>
movq   $0x0,(%rdi)
jmp    1439 <flt_difference+0x339>
test   %ebx,%ebx
je     128b <flt_difference+0x18b>
neg    %ebx
not    %ecx
not    %edx
jmp    1299 <flt_difference+0x199>
test   %ecx,%ecx
je     132b <flt_difference+0x22b>
neg    %ecx
not    %edx
xor    %ebx,%ebx
mov    $0x80000000,%esi
test   $0x300000,%edx
je     136d <flt_difference+0x26d>
test   $0x200000,%edx
je     12cf <flt_difference+0x1cf>
xor    %eax,%eax
cmp    $0x7fd,%r14d
ja     143e <flt_difference+0x33e>
shrd   $0x1,%ecx,%ebx
shrd   $0x1,%edx,%ecx
shr    %edx
add    $0x1,%r14d
test   %ebx,%ebx
jns    1423 <flt_difference+0x323>
test   $0x1,%cl
jne    12e8 <flt_difference+0x1e8>
cmp    $0x80000000,%ebx
je     1423 <flt_difference+0x323>
cmp    $0xffffffff,%ecx
je     13fe <flt_difference+0x2fe>
add    $0x1,%ecx
jmp    1423 <flt_difference+0x323>
mov    %eax,%r10d
neg    %r10d
lea    0x20(%rax),%r11d
mov    %edx,%r15d
mov    %eax,%ecx
shl    %cl,%r15d
mov    %esi,%eax
mov    %edx,%esi
mov    %eax,%edx
mov    %r11d,%ecx
shl    %cl,%edx
mov    %r10d,%ecx
shr    %cl,%esi
or     %edx,%esi
shr    %cl,%eax
mov    %ebp,%r14d
mov    %esi,%edx
mov    %eax,%esi
jmp    1211 <flt_difference+0x111>
neg    %edx
mov    $0x80000000,%esi
xor    %ecx,%ecx
xor    %ebx,%ebx
test   $0x300000,%edx
jne    12aa <flt_difference+0x1aa>
jmp    136d <flt_difference+0x26d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %ecx,%edx
shld   $0x15,%ebx,%ecx
shr    $0xb,%edx
shl    $0x15,%ebx
lea    -0x15(%r14),%eax
cmp    $0x15,%r14d
mov    %eax,%r14d
jle    1273 <flt_difference+0x173>
test   %edx,%edx
je     1350 <flt_difference+0x250>
jmp    139c <flt_difference+0x29c>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
shld   $0x8,%ecx,%edx
shld   $0x8,%ebx,%ecx
shl    $0x8,%ebx
lea    -0x8(%r14),%eax
cmp    $0x8,%r14d
mov    %eax,%r14d
jle    1273 <flt_difference+0x173>
test   $0x1fe000,%edx
je     1380 <flt_difference+0x280>
jmp    13cc <flt_difference+0x2cc>
cs nopw 0x0(%rax,%rax,1)
shld   $0x3,%ecx,%edx
shld   $0x3,%ebx,%ecx
shl    $0x3,%ebx
lea    -0x3(%r14),%eax
cmp    $0x3,%r14d
mov    %eax,%r14d
jle    1273 <flt_difference+0x173>
test   $0x1c0000,%edx
je     13b0 <flt_difference+0x2b0>
jmp    13f1 <flt_difference+0x2f1>
shld   $0x1,%ecx,%edx
shld   $0x1,%ebx,%ecx
add    %ebx,%ebx
lea    -0x1(%r14),%eax
cmp    $0x1,%r14d
mov    %eax,%r14d
jle    1273 <flt_difference+0x173>
test   $0x100000,%edx
je     13d6 <flt_difference+0x2d6>
jmp    12cf <flt_difference+0x1cf>
add    $0x1,%edx
xor    %ecx,%ecx
test   $0x200000,%edx
je     1423 <flt_difference+0x323>
xor    %ecx,%ecx
cmp    $0x7fd,%r14d
jbe    141a <flt_difference+0x31a>
xor    %eax,%eax
jmp    143e <flt_difference+0x33e>
add    $0x1,%r14d
mov    $0x100000,%edx
and    $0xffefffff,%edx
shl    $0x14,%r14d
or     %esi,%r14d
or     %edx,%r14d
mov    %r14d,(%rdi)
mov    %ecx,0x4(%rdi)
mov    $0x1,%eax
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @flt_difference(i32* nocapture writeonly %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = lshr i32 %1, 20
%7 = and i32 %6, 2047
%8 = lshr i32 %3, 20
%9 = and i32 %8, 2047
%10 = sub nsw i32 %7, %9
%11 = icmp slt i32 %10, -54
%12 = icmp eq i32 %7, 0
%13 = or i1 %12, %11
br i1 %13, label %14, label %17
14: ; preds = %5
%15 = xor i32 %3, -2147483648
store i32 %15, i32* %0
%16 = getelementptr inbounds i32, i32* %0, i64 1
store i32 %4, i32* %16
br label %249
17: ; preds = %5
%18 = icmp sgt i32 %10, 54
%19 = icmp eq i32 %9, 0
%20 = or i1 %19, %18
br i1 %20, label %21, label %23
21: ; preds = %17
store i32 %1, i32* %0
%22 = getelementptr inbounds i32, i32* %0, i64 1
store i32 %2, i32* %22
br label %249
23: ; preds = %17
%24 = and i32 %1, 1048575
%25 = or i32 %24, 1048576
%26 = and i32 %3, 1048575
%27 = or i32 %26, 1048576
%28 = icmp sgt i32 %10, 0
br i1 %28, label %29, label %56
29: ; preds = %23
%30 = icmp ugt i32 %10, 32
br i1 %30, label %34, label %31
31: ; preds = %29
%32 = sub nuw nsw i32 32, %10
%33 = shl i32 %4, %32
br label %40
34: ; preds = %29
%35 = add nsw i32 %10, -32
%36 = sub nuw nsw i32 64, %10
%37 = icmp eq i32 %4, 0
%38 = shl i32 %27, %36
%39 = or i32 %38, 1
br i1 %37, label %40, label %46
40: ; preds = %31, %34
%41 = phi i32 [ %33, %31 ], [ %38, %34 ]
%42 = phi i32 [ %32, %31 ], [ %36, %34 ]
%43 = phi i32 [ %10, %31 ], [ %35, %34 ]
%44 = phi i32 [ %27, %31 ], [ 0, %34 ]
%45 = phi i32 [ %4, %31 ], [ %27, %34 ]
br label %46
46: ; preds = %34, %40
%47 = phi i32 [ %42, %40 ], [ %36, %34 ]
%48 = phi i32 [ %43, %40 ], [ %35, %34 ]
%49 = phi i32 [ %44, %40 ], [ 0, %34 ]
%50 = phi i32 [ %45, %40 ], [ %27, %34 ]
%51 = phi i32 [ %41, %40 ], [ %39, %34 ]
%52 = shl i32 %49, %47
%53 = lshr i32 %50, %48
%54 = or i32 %53, %52
%55 = lshr i32 %49, %48
br label %86
56: ; preds = %23
%57 = icmp slt i32 %10, 0
br i1 %57, label %58, label %86
58: ; preds = %56
%59 = icmp ult i32 %10, -32
br i1 %59, label %64, label %60
60: ; preds = %58
%61 = sub nsw i32 0, %10
%62 = add nsw i32 %10, 32
%63 = shl i32 %2, %62
br label %70
64: ; preds = %58
%65 = sub nuw nsw i32 -32, %10
%66 = add nsw i32 %10, 64
%67 = icmp eq i32 %2, 0
%68 = shl i32 %25, %66
%69 = or i32 %68, 1
br i1 %67, label %70, label %76
70: ; preds = %60, %64
%71 = phi i32 [ %63, %60 ], [ %68, %64 ]
%72 = phi i32 [ %62, %60 ], [ %66, %64 ]
%73 = phi i32 [ %61, %60 ], [ %65, %64 ]
%74 = phi i32 [ %25, %60 ], [ 0, %64 ]
%75 = phi i32 [ %2, %60 ], [ %25, %64 ]
br label %76
76: ; preds = %64, %70
%77 = phi i32 [ %72, %70 ], [ %66, %64 ]
%78 = phi i32 [ %73, %70 ], [ %65, %64 ]
%79 = phi i32 [ %74, %70 ], [ 0, %64 ]
%80 = phi i32 [ %75, %70 ], [ %25, %64 ]
%81 = phi i32 [ %71, %70 ], [ %69, %64 ]
%82 = shl i32 %79, %77
%83 = lshr i32 %80, %78
%84 = or i32 %83, %82
%85 = lshr i32 %79, %78
br label %86
86: ; preds = %56, %76, %46
%87 = phi i32 [ %54, %46 ], [ %4, %76 ], [ %4, %56 ]
%88 = phi i32 [ 0, %46 ], [ %81, %76 ], [ 0, %56 ]
%89 = phi i32 [ %51, %46 ], [ 0, %76 ], [ 0, %56 ]
%90 = phi i32 [ %55, %46 ], [ %27, %76 ], [ %27, %56 ]
%91 = phi i32 [ %7, %46 ], [ %9, %76 ], [ %7, %56 ]
%92 = phi i32 [ %2, %46 ], [ %84, %76 ], [ %2, %56 ]
%93 = phi i32 [ %25, %46 ], [ %85, %76 ], [ %25, %56 ]
%94 = and i32 %88, 255
%95 = and i32 %89, 255
%96 = sub nsw i32 %94, %95
%97 = lshr i32 %88, 8
%98 = lshr i32 %89, 8
%99 = sub nsw i32 %97, %98
%100 = ashr i32 %96, 8
%101 = add nsw i32 %100, %99
%102 = ashr i32 %101, 24
%103 = shl i32 %101, 8
%104 = and i32 %96, 255
%105 = or i32 %103, %104
%106 = and i32 %92, 255
%107 = and i32 %87, 255
%108 = sub nsw i32 %106, %107
%109 = add nsw i32 %108, %102
%110 = lshr i32 %92, 8
%111 = lshr i32 %87, 8
%112 = sub nsw i32 %110, %111
%113 = ashr i32 %109, 8
%114 = add nsw i32 %113, %112
%115 = ashr i32 %114, 24
%116 = shl i32 %114, 8
%117 = and i32 %109, 255
%118 = or i32 %116, %117
%119 = sub i32 %93, %90
%120 = add i32 %115, %119
%121 = icmp sgt i32 %120, -1
br i1 %121, label %135, label %122
122: ; preds = %86
%123 = icmp eq i32 %105, 0
br i1 %123, label %124, label %131
124: ; preds = %122
%125 = icmp eq i32 %118, 0
br i1 %125, label %126, label %128
126: ; preds = %124
%127 = sub i32 0, %120
br label %143
128: ; preds = %124
%129 = sub i32 0, %118
%130 = xor i32 %120, -1
br label %143
131: ; preds = %122
%132 = sub i32 0, %105
%133 = xor i32 %118, -1
%134 = xor i32 %120, -1
br label %143
135: ; preds = %86
%136 = icmp eq i32 %120, 0
%137 = icmp eq i32 %118, 0
%138 = select i1 %136, i1 %137, i1 false
%139 = icmp eq i32 %105, 0
%140 = select i1 %138, i1 %139, i1 false
br i1 %140, label %141, label %143
141: ; preds = %135
%142 = getelementptr inbounds i32, i32* %0, i64 1
store i32 0, i32* %142
store i32 0, i32* %0
br label %249
143: ; preds = %131, %128, %126, %135
%144 = phi i32 [ %120, %135 ], [ %134, %131 ], [ %130, %128 ], [ %127, %126 ]
%145 = phi i32 [ %118, %135 ], [ %133, %131 ], [ %129, %128 ], [ 0, %126 ]
%146 = phi i32 [ 0, %135 ], [ -2147483648, %131 ], [ -2147483648, %128 ], [ -2147483648, %126 ]
%147 = phi i32 [ %105, %135 ], [ %132, %131 ], [ 0, %128 ], [ 0, %126 ]
%148 = and i32 %144, 3145728
%149 = icmp eq i32 %148, 0
br i1 %149, label %150, label %209
150: ; preds = %143, %156
%151 = phi i32 [ %159, %156 ], [ %147, %143 ]
%152 = phi i32 [ %160, %156 ], [ %91, %143 ]
%153 = phi i32 [ %158, %156 ], [ %145, %143 ]
%154 = phi i32 [ %157, %156 ], [ %144, %143 ]
%155 = icmp eq i32 %154, 0
br i1 %155, label %156, label %164
156: ; preds = %150
%157 = lshr i32 %153, 11
%158 = tail call i32 @llvm.fshl.i32(i32 %153, i32 %151, i32 21)
%159 = shl i32 %151, 21
%160 = add nsw i32 %152, -21
%161 = icmp slt i32 %152, 22
br i1 %161, label %162, label %150
162: ; preds = %156
%163 = getelementptr inbounds i32, i32* %0, i64 1
store i32 0, i32* %163
store i32 0, i32* %0
br label %249
164: ; preds = %150, %171
%165 = phi i32 [ %174, %171 ], [ %151, %150 ]
%166 = phi i32 [ %175, %171 ], [ %152, %150 ]
%167 = phi i32 [ %173, %171 ], [ %153, %150 ]
%168 = phi i32 [ %172, %171 ], [ %154, %150 ]
%169 = and i32 %168, 2088960
%170 = icmp eq i32 %169, 0
br i1 %170, label %171, label %179
171: ; preds = %164
%172 = tail call i32 @llvm.fshl.i32(i32 %168, i32 %167, i32 8)
%173 = tail call i32 @llvm.fshl.i32(i32 %167, i32 %165, i32 8)
%174 = shl i32 %165, 8
%175 = add nsw i32 %166, -8
%176 = icmp slt i32 %166, 9
br i1 %176, label %177, label %164
177: ; preds = %171
%178 = getelementptr inbounds i32, i32* %0, i64 1
store i32 0, i32* %178
store i32 0, i32* %0
br label %249
179: ; preds = %164, %186
%180 = phi i32 [ %189, %186 ], [ %165, %164 ]
%181 = phi i32 [ %190, %186 ], [ %166, %164 ]
%182 = phi i32 [ %188, %186 ], [ %167, %164 ]
%183 = phi i32 [ %187, %186 ], [ %168, %164 ]
%184 = and i32 %183, 1835008
%185 = icmp eq i32 %184, 0
br i1 %185, label %186, label %194
186: ; preds = %179
%187 = tail call i32 @llvm.fshl.i32(i32 %183, i32 %182, i32 3)
%188 = tail call i32 @llvm.fshl.i32(i32 %182, i32 %180, i32 3)
%189 = shl i32 %180, 3
%190 = add nsw i32 %181, -3
%191 = icmp slt i32 %181, 4
br i1 %191, label %192, label %179
192: ; preds = %186
%193 = getelementptr inbounds i32, i32* %0, i64 1
store i32 0, i32* %193
store i32 0, i32* %0
br label %249
194: ; preds = %179, %201
%195 = phi i32 [ %204, %201 ], [ %180, %179 ]
%196 = phi i32 [ %205, %201 ], [ %181, %179 ]
%197 = phi i32 [ %203, %201 ], [ %182, %179 ]
%198 = phi i32 [ %202, %201 ], [ %183, %179 ]
%199 = and i32 %198, 1048576
%200 = icmp eq i32 %199, 0
br i1 %200, label %201, label %218
201: ; preds = %194
%202 = tail call i32 @llvm.fshl.i32(i32 %198, i32 %197, i32 1)
%203 = tail call i32 @llvm.fshl.i32(i32 %197, i32 %195, i32 1)
%204 = shl i32 %195, 1
%205 = add nsw i32 %196, -1
%206 = icmp slt i32 %196, 2
br i1 %206, label %207, label %194
207: ; preds = %201
%208 = getelementptr inbounds i32, i32* %0, i64 1
store i32 0, i32* %208
store i32 0, i32* %0
br label %249
209: ; preds = %143
%210 = and i32 %144, 2097152
%211 = icmp eq i32 %210, 0
br i1 %211, label %218, label %212
212: ; preds = %209
%213 = tail call i32 @llvm.fshl.i32(i32 %145, i32 %147, i32 31)
%214 = tail call i32 @llvm.fshl.i32(i32 %144, i32 %145, i32 31)
%215 = lshr i32 %144, 1
%216 = add nuw nsw i32 %91, 1
%217 = icmp ugt i32 %91, 2045
br i1 %217, label %249, label %218
218: ; preds = %194, %209, %212
%219 = phi i32 [ %213, %212 ], [ %147, %209 ], [ %195, %194 ]
%220 = phi i32 [ %216, %212 ], [ %91, %209 ], [ %196, %194 ]
%221 = phi i32 [ %214, %212 ], [ %145, %209 ], [ %197, %194 ]
%222 = phi i32 [ %215, %212 ], [ %144, %209 ], [ %198, %194 ]
%223 = icmp sgt i32 %219, -1
br i1 %223, label %240, label %224
224: ; preds = %218
%225 = and i32 %221, 1
%226 = icmp ne i32 %225, 0
%227 = icmp ne i32 %219, -2147483648
%228 = select i1 %226, i1 true, i1 %227
br i1 %228, label %229, label %240
229: ; preds = %224
%230 = icmp eq i32 %221, -1
br i1 %230, label %231, label %238
231: ; preds = %229
%232 = add i32 %222, 1
%233 = and i32 %232, 2097152
%234 = icmp eq i32 %233, 0
br i1 %234, label %240, label %235
235: ; preds = %231
%236 = add nuw nsw i32 %220, 1
%237 = icmp ugt i32 %220, 2045
br i1 %237, label %249, label %240
238: ; preds = %229
%239 = add nuw i32 %221, 1
br label %240
240: ; preds = %238, %235, %231, %224, %218
%241 = phi i32 [ %236, %235 ], [ %220, %231 ], [ %220, %238 ], [ %220, %224 ], [ %220, %218 ]
%242 = phi i32 [ 0, %235 ], [ 0, %231 ], [ %239, %238 ], [ %221, %224 ], [ %221, %218 ]
%243 = phi i32 [ 1048576, %235 ], [ %232, %231 ], [ %222, %238 ], [ %222, %224 ], [ %222, %218 ]
%244 = and i32 %243, -1048577
%245 = shl i32 %241, 20
%246 = or i32 %245, %146
%247 = or i32 %246, %244
store i32 %247, i32* %0
%248 = getelementptr inbounds i32, i32* %0, i64 1
store i32 %242, i32* %248
br label %249
249: ; preds = %235, %212, %240, %207, %192, %177, %162, %141, %21, %14
%250 = phi i32 [ 1, %14 ], [ 1, %21 ], [ 1, %141 ], [ 1, %162 ], [ 1, %177 ], [ 1, %192 ], [ 1, %207 ], [ 1, %240 ], [ 0, %212 ], [ 0, %235 ]
ret i32 %250
}