double log(double x) {
  double hfsq, f, s, z, R, w, t1, t2, dk;
  int k, hx, i, j;
  unsigned lx;
  hx = *(1 + (int *)&x);
  lx = *(int *)&x;
  k = 0;
  if (hx < 0x00100000) {
    if (((hx & 0x7fffffff) | lx) == 0) {
      return -1.80143985094819840000e+16 / 0.0;
    }
    if (hx < 0) {
      return (x - x) / 0.0;
    }
    k -= 54;
    x *= 1.80143985094819840000e+16;
    hx = *(1 + (int *)&x);
  }
  if (hx >= 0x7ff00000) {
    return x + x;
  }
  k += (hx >> 20) - 1023;
  hx &= 0x000fffff;
  i = (hx + 0x95f64) & 0x100000;
  *(1 + (int *)&x) = hx | (i ^ 0x3ff00000);
  k += (i >> 20);
  f = x - 1.0;
  if ((0x000fffff & (2 + hx)) < 3) {
    if (f == 0.0) {
      if (k == 0) {
        return 0.0;
      } else {
        dk = (double)k;
        return dk * 6.93147180369123816490e-01 +
               dk * 1.90821492927058770002e-10;
      }
    }
    R = f * f * (0.5 - 0.33333333333333333 * f);
    if (k == 0) {
      return f - R;
    } else {
      dk = (double)k;
      return dk * 6.93147180369123816490e-01 -
             ((R - dk * 1.90821492927058770002e-10) - f);
    }
  }
  s = f / (2.0 + f);
  dk = (double)k;
  z = s * s;
  i = hx - 0x6147a;
  w = z * z;
  j = 0x6b851 - hx;
  t1 = w * (3.999999999940941908e-01 +
            w * (2.222219843214978396e-01 + w * 1.531383769920937332e-01));
  t2 =
      z * (6.666666666666735130e-01 +
           w * (2.857142874366239149e-01 +
                w * (1.818357216161805012e-01 + w * 1.479819860511658591e-01)));
  i |= j;
  R = t2 + t1;
  if (i > 0) {
    hfsq = 0.5 * f * f;
    if (k == 0) {
      return f - (hfsq - s * (hfsq + R));
    } else {
      return dk * 6.93147180369123816490e-01 -
             ((hfsq - (s * (hfsq + R) + dk * 1.90821492927058770002e-10)) - f);
    }
  } else {
    if (k == 0) {
      return f - s * (f - R);
    } else {
      return dk * 6.93147180369123816490e-01 -
             ((s * (f - R) - dk * 1.90821492927058770002e-10) - f);
    }
  }
}


x86 assembly (clang, -O0):
<log>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x60(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x6c(%rbp)
movl   $0x0,-0x5c(%rbp)
cmpl   $0x100000,-0x60(%rbp)
jge    1195 <log+0x95>
mov    -0x60(%rbp),%eax
and    $0x7fffffff,%eax
or     -0x6c(%rbp),%eax
cmp    $0x0,%eax
jne    114f <log+0x4f>
movsd  0xf2b(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
cmpl   $0x0,-0x60(%rbp)
jge    1174 <log+0x74>
movsd  -0x10(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
mov    -0x5c(%rbp),%eax
sub    $0x36,%eax
mov    %eax,-0x5c(%rbp)
movsd  0xe7b(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x60(%rbp)
cmpl   $0x7ff00000,-0x60(%rbp)
jl     11b6 <log+0xb6>
movsd  -0x10(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
mov    -0x60(%rbp),%eax
sar    $0x14,%eax
sub    $0x3ff,%eax
add    -0x5c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x60(%rbp),%eax
and    $0xfffff,%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
add    $0x95f64,%eax
and    $0x100000,%eax
mov    %eax,-0x64(%rbp)
mov    -0x60(%rbp),%eax
mov    -0x64(%rbp),%ecx
xor    $0x3ff00000,%ecx
or     %ecx,%eax
mov    %eax,-0xc(%rbp)
mov    -0x64(%rbp),%eax
sar    $0x14,%eax
add    -0x5c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xdfc(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x60(%rbp),%eax
add    $0x2,%eax
and    $0xfffff,%eax
cmp    $0x3,%eax
jge    1352 <log+0x252>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    128e <log+0x18e>
jp     128e <log+0x18e>
cmpl   $0x0,-0x5c(%rbp)
jne    1258 <log+0x158>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
cvtsi2sdl -0x5c(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  0xde9(%rip),%xmm1
mulsd  -0x58(%rbp),%xmm1
movsd  0xdd4(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
movsd  0xdc3(%rip),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xdaf(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpl   $0x0,-0x5c(%rbp)
jne    12dc <log+0x1dc>
movsd  -0x20(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
cvtsi2sdl -0x5c(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xd44(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  -0x20(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xd10(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
movsd  -0x20(%rbp),%xmm0
movsd  0xce9(%rip),%xmm1
addsd  -0x20(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
cvtsi2sdl -0x5c(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x28(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x60(%rbp),%eax
sub    $0x6147a,%eax
mov    %eax,-0x64(%rbp)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    $0x6b851,%eax
sub    -0x60(%rbp),%eax
mov    %eax,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movsd  0xc76(%rip),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xc72(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xc52(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm3
movsd  0xc19(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xc15(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xbf5(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xbdd(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x68(%rbp),%eax
or     -0x64(%rbp),%eax
mov    %eax,-0x64(%rbp)
movsd  -0x50(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpl   $0x0,-0x64(%rbp)
jle    1531 <log+0x431>
movsd  0xbf6(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
cmpl   $0x0,-0x5c(%rbp)
jne    14c9 <log+0x3c9>
movsd  -0x20(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
movsd  -0x28(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm3
addsd  -0x38(%rbp),%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
movsd  -0x58(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm4
addsd  -0x38(%rbp),%xmm4
movsd  0xb6e(%rip),%xmm3
mulsd  -0x58(%rbp),%xmm3
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
subsd  %xmm2,%xmm1
subsd  -0x20(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xb31(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
cmpl   $0x0,-0x5c(%rbp)
jne    1578 <log+0x478>
movsd  -0x20(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
subsd  -0x38(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    15e9 <log+0x4e9>
movsd  -0x58(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm3
subsd  -0x38(%rbp),%xmm3
movsd  0xac4(%rip),%xmm2
mulsd  -0x58(%rbp),%xmm2
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  -0x20(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xa74(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<log>:
movdqa %xmm0,%xmm1
movq   %xmm0,%rax
mov    %rax,%rdx
shr    $0x20,%rdx
mov    $0xfffffc01,%esi
cmp    $0xfffff,%edx
jg     114a <log+0x4a>
and    $0x7fffffff,%edx
or     %eax,%edx
je     11f0 <log+0xf0>
test   %rax,%rax
js     12dc <log+0x1dc>
mulsd  0xecc(%rip),%xmm1
movq   %xmm1,%rdx
shr    $0x20,%rdx
mov    $0xfffffbcb,%esi
cmp    $0x7ff00000,%edx
jl     115b <log+0x5b>
addsd  %xmm1,%xmm1
movapd %xmm1,%xmm0
ret
mov    %edx,%eax
sar    $0x14,%eax
add    %eax,%esi
mov    %edx,%ecx
and    $0xfffff,%ecx
lea    0x95f64(%rcx),%r8d
mov    %r8d,%edi
and    $0x100000,%edi
or     %ecx,%edi
xor    $0x3ff00000,%edi
movq   %xmm1,%rax
shl    $0x20,%rdi
mov    %eax,%eax
or     %rdi,%rax
movq   %rax,%xmm0
shr    $0x14,%r8d
addsd  0xe6f(%rip),%xmm0
add    %esi,%r8d
add    $0x2,%edx
and    $0xfffff,%edx
cmp    $0x2,%edx
ja     11f9 <log+0xf9>
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12ed <log+0x1ed>
jp     12ed <log+0x1ed>
test   %r8d,%r8d
je     1374 <log+0x274>
xorps  %xmm0,%xmm0
cvtsi2sd %r8d,%xmm0
movsd  0xe91(%rip),%xmm1
mulsd  %xmm0,%xmm1
mulsd  0xe75(%rip),%xmm0
addsd  %xmm1,%xmm0
ret
movsd  0xe08(%rip),%xmm0
ret
movsd  0xe17(%rip),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm0,%xmm2
divsd  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsi2sd %r8d,%xmm1
movapd %xmm2,%xmm4
mulsd  %xmm2,%xmm4
movapd %xmm4,%xmm5
mulsd  %xmm4,%xmm5
movsd  0xdf3(%rip),%xmm6
mulsd  %xmm5,%xmm6
addsd  0xdef(%rip),%xmm6
mov    $0x6b851,%eax
mulsd  %xmm5,%xmm6
addsd  0xde6(%rip),%xmm6
movsd  0xde6(%rip),%xmm3
mulsd  %xmm5,%xmm3
addsd  0xde2(%rip),%xmm3
sub    %ecx,%eax
mulsd  %xmm5,%xmm3
addsd  0xddc(%rip),%xmm3
add    $0xfff9eb86,%ecx
mulsd  %xmm5,%xmm3
addsd  0xdd2(%rip),%xmm3
mulsd  %xmm5,%xmm6
mulsd  %xmm4,%xmm3
addsd  %xmm6,%xmm3
or     %eax,%ecx
jle    1328 <log+0x228>
movsd  0xdce(%rip),%xmm4
mulsd  %xmm0,%xmm4
mulsd  %xmm0,%xmm4
addsd  %xmm4,%xmm3
test   %r8d,%r8d
je     135e <log+0x25e>
movsd  0xdb9(%rip),%xmm5
mulsd  %xmm1,%xmm5
mulsd  %xmm3,%xmm2
addsd  %xmm5,%xmm2
subsd  %xmm2,%xmm4
subsd  %xmm0,%xmm4
mulsd  0xd8d(%rip),%xmm1
subsd  %xmm4,%xmm1
movapd %xmm1,%xmm0
ret
subsd  %xmm1,%xmm1
pxor   %xmm0,%xmm0
divsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
ret
movapd %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movsd  0xd7b(%rip),%xmm2
mulsd  %xmm0,%xmm2
addsd  0xd5f(%rip),%xmm2
mulsd  %xmm1,%xmm2
test   %r8d,%r8d
je     136c <log+0x26c>
xorps  %xmm1,%xmm1
cvtsi2sd %r8d,%xmm1
movsd  0xd36(%rip),%xmm3
mulsd  %xmm1,%xmm3
jmp    1345 <log+0x245>
movapd %xmm0,%xmm4
subsd  %xmm3,%xmm4
test   %r8d,%r8d
je     1379 <log+0x279>
movsd  0xd1b(%rip),%xmm3
mulsd  %xmm1,%xmm3
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
subsd  %xmm0,%xmm2
mulsd  0xd0b(%rip),%xmm1
subsd  %xmm2,%xmm1
movapd %xmm1,%xmm0
ret
mulsd  %xmm3,%xmm2
subsd  %xmm2,%xmm4
subsd  %xmm4,%xmm0
jmp    1370 <log+0x270>
subsd  %xmm2,%xmm0
movapd %xmm0,%xmm1
movapd %xmm1,%xmm0
ret
mulsd  %xmm4,%xmm2
subsd  %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @log(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
store double %0, double* %3
%18 = bitcast double* %3 to i32*
%19 = getelementptr inbounds i32, i32* %18, i64 1
%20 = load i32, i32* %19
store i32 %20, i32* %14
%21 = bitcast double* %3 to i32*
%22 = load i32, i32* %21
store i32 %22, i32* %17
store i32 0, i32* %13
%23 = load i32, i32* %14
%24 = icmp slt i32 %23, 1048576
br i1 %24, label %25, label %48
25: ; preds = %1
%26 = load i32, i32* %14
%27 = and i32 %26, 2147483647
%28 = load i32, i32* %17
%29 = or i32 %27, %28
%30 = icmp eq i32 %29, 0
br i1 %30, label %31, label %32
31: ; preds = %25
store double 0xFFF0000000000000, double* %2
br label %217
32: ; preds = %25
%33 = load i32, i32* %14
%34 = icmp slt i32 %33, 0
br i1 %34, label %35, label %40
35: ; preds = %32
%36 = load double, double* %3
%37 = load double, double* %3
%38 = fsub double %36, %37
%39 = fdiv double %38, 0.000000e+00
store double %39, double* %2
br label %217
40: ; preds = %32
%41 = load i32, i32* %13
%42 = sub nsw i32 %41, 54
store i32 %42, i32* %13
%43 = load double, double* %3
%44 = fmul double %43, 0x4350000000000000
store double %44, double* %3
%45 = bitcast double* %3 to i32*
%46 = getelementptr inbounds i32, i32* %45, i64 1
%47 = load i32, i32* %46
store i32 %47, i32* %14
br label %48
48: ; preds = %40, %1
%49 = load i32, i32* %14
%50 = icmp sge i32 %49, 2146435072
br i1 %50, label %51, label %55
51: ; preds = %48
%52 = load double, double* %3
%53 = load double, double* %3
%54 = fadd double %52, %53
store double %54, double* %2
br label %217
55: ; preds = %48
%56 = load i32, i32* %14
%57 = ashr i32 %56, 20
%58 = sub nsw i32 %57, 1023
%59 = load i32, i32* %13
%60 = add nsw i32 %59, %58
store i32 %60, i32* %13
%61 = load i32, i32* %14
%62 = and i32 %61, 1048575
store i32 %62, i32* %14
%63 = load i32, i32* %14
%64 = add nsw i32 %63, 614244
%65 = and i32 %64, 1048576
store i32 %65, i32* %15
%66 = load i32, i32* %14
%67 = load i32, i32* %15
%68 = xor i32 %67, 1072693248
%69 = or i32 %66, %68
%70 = bitcast double* %3 to i32*
%71 = getelementptr inbounds i32, i32* %70, i64 1
store i32 %69, i32* %71
%72 = load i32, i32* %15
%73 = ashr i32 %72, 20
%74 = load i32, i32* %13
%75 = add nsw i32 %74, %73
store i32 %75, i32* %13
%76 = load double, double* %3
%77 = fsub double %76, 1.000000e+00
store double %77, double* %5
%78 = load i32, i32* %14
%79 = add nsw i32 2, %78
%80 = and i32 1048575, %79
%81 = icmp slt i32 %80, 3
br i1 %81, label %82, label %121
82: ; preds = %55
%83 = load double, double* %5
%84 = fcmp oeq double %83, 0.000000e+00
br i1 %84, label %85, label %96
85: ; preds = %82
%86 = load i32, i32* %13
%87 = icmp eq i32 %86, 0
br i1 %87, label %88, label %89
88: ; preds = %85
store double 0.000000e+00, double* %2
br label %217
89: ; preds = %85
%90 = load i32, i32* %13
%91 = sitofp i32 %90 to double
store double %91, double* %12
%92 = load double, double* %12
%93 = load double, double* %12
%94 = fmul double %93, 0x3DEA39EF35793C76
%95 = call double @llvm.fmuladd.f64(double %92, double 0x3FE62E42FEE00000, double %94)
store double %95, double* %2
br label %217
96: ; preds = %82
%97 = load double, double* %5
%98 = load double, double* %5
%99 = fmul double %97, %98
%100 = load double, double* %5
%101 = call double @llvm.fmuladd.f64(double 0xBFD5555555555555, double %100, double 5.000000e-01)
%102 = fmul double %99, %101
store double %102, double* %8
%103 = load i32, i32* %13
%104 = icmp eq i32 %103, 0
br i1 %104, label %105, label %109
105: ; preds = %96
%106 = load double, double* %5
%107 = load double, double* %8
%108 = fsub double %106, %107
store double %108, double* %2
br label %217
109: ; preds = %96
%110 = load i32, i32* %13
%111 = sitofp i32 %110 to double
store double %111, double* %12
%112 = load double, double* %12
%113 = load double, double* %8
%114 = load double, double* %12
%115 = fneg double %114
%116 = call double @llvm.fmuladd.f64(double %115, double 0x3DEA39EF35793C76, double %113)
%117 = load double, double* %5
%118 = fsub double %116, %117
%119 = fneg double %118
%120 = call double @llvm.fmuladd.f64(double %112, double 0x3FE62E42FEE00000, double %119)
store double %120, double* %2
br label %217
121: ; preds = %55
%122 = load double, double* %5
%123 = load double, double* %5
%124 = fadd double 2.000000e+00, %123
%125 = fdiv double %122, %124
store double %125, double* %6
%126 = load i32, i32* %13
%127 = sitofp i32 %126 to double
store double %127, double* %12
%128 = load double, double* %6
%129 = load double, double* %6
%130 = fmul double %128, %129
store double %130, double* %7
%131 = load i32, i32* %14
%132 = sub nsw i32 %131, 398458
store i32 %132, i32* %15
%133 = load double, double* %7
%134 = load double, double* %7
%135 = fmul double %133, %134
store double %135, double* %9
%136 = load i32, i32* %14
%137 = sub nsw i32 440401, %136
store i32 %137, i32* %16
%138 = load double, double* %9
%139 = load double, double* %9
%140 = load double, double* %9
%141 = call double @llvm.fmuladd.f64(double %140, double 0x3FC39A09D078C69F, double 0x3FCC71C51D8E78AF)
%142 = call double @llvm.fmuladd.f64(double %139, double %141, double 0x3FD999999997FA04)
%143 = fmul double %138, %142
store double %143, double* %10
%144 = load double, double* %7
%145 = load double, double* %9
%146 = load double, double* %9
%147 = load double, double* %9
%148 = call double @llvm.fmuladd.f64(double %147, double 0x3FC2F112DF3E5244, double 0x3FC7466496CB03DE)
%149 = call double @llvm.fmuladd.f64(double %146, double %148, double 0x3FD2492494229359)
%150 = call double @llvm.fmuladd.f64(double %145, double %149, double 0x3FE5555555555593)
%151 = fmul double %144, %150
store double %151, double* %11
%152 = load i32, i32* %16
%153 = load i32, i32* %15
%154 = or i32 %153, %152
store i32 %154, i32* %15
%155 = load double, double* %11
%156 = load double, double* %10
%157 = fadd double %155, %156
store double %157, double* %8
%158 = load i32, i32* %15
%159 = icmp sgt i32 %158, 0
br i1 %159, label %160, label %192
160: ; preds = %121
%161 = load double, double* %5
%162 = fmul double 5.000000e-01, %161
%163 = load double, double* %5
%164 = fmul double %162, %163
store double %164, double* %4
%165 = load i32, i32* %13
%166 = icmp eq i32 %165, 0
br i1 %166, label %167, label %177
167: ; preds = %160
%168 = load double, double* %5
%169 = load double, double* %4
%170 = load double, double* %6
%171 = load double, double* %4
%172 = load double, double* %8
%173 = fadd double %171, %172
%174 = fneg double %170
%175 = call double @llvm.fmuladd.f64(double %174, double %173, double %169)
%176 = fsub double %168, %175
store double %176, double* %2
br label %217
177: ; preds = %160
%178 = load double, double* %12
%179 = load double, double* %4
%180 = load double, double* %6
%181 = load double, double* %4
%182 = load double, double* %8
%183 = fadd double %181, %182
%184 = load double, double* %12
%185 = fmul double %184, 0x3DEA39EF35793C76
%186 = call double @llvm.fmuladd.f64(double %180, double %183, double %185)
%187 = fsub double %179, %186
%188 = load double, double* %5
%189 = fsub double %187, %188
%190 = fneg double %189
%191 = call double @llvm.fmuladd.f64(double %178, double 0x3FE62E42FEE00000, double %190)
store double %191, double* %2
br label %217
192: ; preds = %121
%193 = load i32, i32* %13
%194 = icmp eq i32 %193, 0
br i1 %194, label %195, label %203
195: ; preds = %192
%196 = load double, double* %5
%197 = load double, double* %6
%198 = load double, double* %5
%199 = load double, double* %8
%200 = fsub double %198, %199
%201 = fneg double %197
%202 = call double @llvm.fmuladd.f64(double %201, double %200, double %196)
store double %202, double* %2
br label %217
203: ; preds = %192
%204 = load double, double* %12
%205 = load double, double* %6
%206 = load double, double* %5
%207 = load double, double* %8
%208 = fsub double %206, %207
%209 = load double, double* %12
%210 = fmul double %209, 0x3DEA39EF35793C76
%211 = fneg double %210
%212 = call double @llvm.fmuladd.f64(double %205, double %208, double %211)
%213 = load double, double* %5
%214 = fsub double %212, %213
%215 = fneg double %214
%216 = call double @llvm.fmuladd.f64(double %204, double 0x3FE62E42FEE00000, double %215)
store double %216, double* %2
br label %217
217: ; preds = %203, %195, %177, %167, %109, %105, %89, %88, %51, %35, %31
%218 = load double, double* %2
ret double %218
}

LLVM IR (-O2):
define double @log(double %0) {
%2 = bitcast double %0 to i64
%3 = lshr i64 %2, 32
%4 = trunc i64 %3 to i32
%5 = icmp slt i32 %4, 1048576
br i1 %5, label %6, label %21
6: ; preds = %1
%7 = trunc i64 %2 to i32
%8 = and i32 %4, 2147483647
%9 = or i32 %8, %7
%10 = icmp eq i32 %9, 0
br i1 %10, label %116, label %11
11: ; preds = %6
%12 = icmp slt i64 %2, 0
br i1 %12, label %13, label %16
13: ; preds = %11
%14 = fsub double %0, %0
%15 = fdiv double %14, 0.000000e+00
br label %116
16: ; preds = %11
%17 = fmul double %0, 0x4350000000000000
%18 = bitcast double %17 to i64
%19 = lshr i64 %18, 32
%20 = trunc i64 %19 to i32
br label %21
21: ; preds = %16, %1
%22 = phi i32 [ -1077, %16 ], [ -1023, %1 ]
%23 = phi i32 [ %20, %16 ], [ %4, %1 ]
%24 = phi double [ %17, %16 ], [ %0, %1 ]
%25 = icmp sgt i32 %23, 2146435071
br i1 %25, label %26, label %28
26: ; preds = %21
%27 = fadd double %24, %24
br label %116
28: ; preds = %21
%29 = ashr i32 %23, 20
%30 = and i32 %23, 1048575
%31 = add nuw nsw i32 %30, 614244
%32 = and i32 %31, 1048576
%33 = or i32 %32, %30
%34 = xor i32 %33, 1072693248
%35 = bitcast double %24 to i64
%36 = zext i32 %34 to i64
%37 = shl nuw nsw i64 %36, 32
%38 = and i64 %35, 4294967295
%39 = or i64 %37, %38
%40 = bitcast i64 %39 to double
%41 = lshr i32 %31, 20
%42 = add nsw i32 %22, %29
%43 = add nsw i32 %42, %41
%44 = fadd double %40, -1.000000e+00
%45 = add nsw i32 %23, 2
%46 = and i32 %45, 1048575
%47 = icmp ult i32 %46, 3
br i1 %47, label %48, label %70
48: ; preds = %28
%49 = fcmp oeq double %44, 0.000000e+00
br i1 %49, label %50, label %56
50: ; preds = %48
%51 = icmp eq i32 %43, 0
br i1 %51, label %116, label %52
52: ; preds = %50
%53 = sitofp i32 %43 to double
%54 = fmul double %53, 0x3DEA39EF35793C76
%55 = tail call double @llvm.fmuladd.f64(double %53, double 0x3FE62E42FEE00000, double %54)
br label %116
56: ; preds = %48
%57 = fmul double %44, %44
%58 = tail call double @llvm.fmuladd.f64(double %44, double 0xBFD5555555555555, double 5.000000e-01)
%59 = fmul double %57, %58
%60 = icmp eq i32 %43, 0
br i1 %60, label %61, label %63
61: ; preds = %56
%62 = fsub double %44, %59
br label %116
63: ; preds = %56
%64 = sitofp i32 %43 to double
%65 = fneg double %64
%66 = tail call double @llvm.fmuladd.f64(double %65, double 0x3DEA39EF35793C76, double %59)
%67 = fsub double %66, %44
%68 = fneg double %67
%69 = tail call double @llvm.fmuladd.f64(double %64, double 0x3FE62E42FEE00000, double %68)
br label %116
70: ; preds = %28
%71 = fadd double %44, 2.000000e+00
%72 = fdiv double %44, %71
%73 = sitofp i32 %43 to double
%74 = fmul double %72, %72
%75 = add nsw i32 %30, -398458
%76 = fmul double %74, %74
%77 = sub nsw i32 440401, %30
%78 = tail call double @llvm.fmuladd.f64(double %76, double 0x3FC39A09D078C69F, double 0x3FCC71C51D8E78AF)
%79 = tail call double @llvm.fmuladd.f64(double %76, double %78, double 0x3FD999999997FA04)
%80 = fmul double %76, %79
%81 = tail call double @llvm.fmuladd.f64(double %76, double 0x3FC2F112DF3E5244, double 0x3FC7466496CB03DE)
%82 = tail call double @llvm.fmuladd.f64(double %76, double %81, double 0x3FD2492494229359)
%83 = tail call double @llvm.fmuladd.f64(double %76, double %82, double 0x3FE5555555555593)
%84 = fmul double %74, %83
%85 = or i32 %75, %77
%86 = fadd double %80, %84
%87 = icmp sgt i32 %85, 0
br i1 %87, label %88, label %104
88: ; preds = %70
%89 = fmul double %44, 5.000000e-01
%90 = fmul double %44, %89
%91 = icmp eq i32 %43, 0
%92 = fadd double %90, %86
br i1 %91, label %93, label %97
93: ; preds = %88
%94 = fneg double %72
%95 = tail call double @llvm.fmuladd.f64(double %94, double %92, double %90)
%96 = fsub double %44, %95
br label %116
97: ; preds = %88
%98 = fmul double %73, 0x3DEA39EF35793C76
%99 = tail call double @llvm.fmuladd.f64(double %72, double %92, double %98)
%100 = fsub double %90, %99
%101 = fsub double %100, %44
%102 = fneg double %101
%103 = tail call double @llvm.fmuladd.f64(double %73, double 0x3FE62E42FEE00000, double %102)
br label %116
104: ; preds = %70
%105 = icmp eq i32 %43, 0
%106 = fsub double %44, %86
br i1 %105, label %107, label %110
107: ; preds = %104
%108 = fneg double %72
%109 = tail call double @llvm.fmuladd.f64(double %108, double %106, double %44)
br label %116
110: ; preds = %104
%111 = fmul double %73, 0xBDEA39EF35793C76
%112 = tail call double @llvm.fmuladd.f64(double %72, double %106, double %111)
%113 = fsub double %112, %44
%114 = fneg double %113
%115 = tail call double @llvm.fmuladd.f64(double %73, double 0x3FE62E42FEE00000, double %114)
br label %116
116: ; preds = %50, %6, %110, %107, %97, %93, %63, %61, %52, %26, %13
%117 = phi double [ %15, %13 ], [ %27, %26 ], [ %55, %52 ], [ %62, %61 ], [ %69, %63 ], [ %96, %93 ], [ %103, %97 ], [ %109, %107 ], [ %115, %110 ], [ 0xFFF0000000000000, %6 ], [ 0.000000e+00, %50 ]
ret double %117
}