double frexp(double x, int *expptr) {
  int sign;
  int exponent;

  if (__builtin_isnan((double)(x)) || x + x == x) {
    *expptr = 0;
    return x;
  }
  sign = 0;
  if (x < 0) {
    x = -x;
    sign = -1;
  };
  {
    double pow2[64];
    double powh[64];
    int i;
    exponent = 0;
    if (x >= 1.0) {
      double pow2_i;
      double powh_i;
      for (i = 0, pow2_i = 2.0, powh_i = 0.5;;
           i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i) {
        if (x >= pow2_i) {
          exponent += (1 << i);
          x *= powh_i;
        } else
          break;
        pow2[i] = pow2_i;
        powh[i] = powh_i;
      }
      while (i > 0 && x < pow2[i - 1]) {
        i--;
        powh_i = powh[i];
      }
      exponent += (1 << i);
      x *= powh_i;
    } else {
      double pow2_i;
      double powh_i;
      for (i = 0, pow2_i = 2.0, powh_i = 0.5;;
           i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i) {
        if (x < powh_i) {
          exponent -= (1 << i);
          x *= pow2_i;
        } else
          break;
        pow2[i] = pow2_i;
        powh[i] = powh_i;
      }
    }
    while (i > 0) {
      i--;
      if (x < powh[i]) {
        exponent -= (1 << i);
        x *= pow2[i];
      }
    }
  }
  if (sign < 0)
    x = -x;
  ;
  *expptr = exponent;
  return x;
}


x86 assembly (clang, -O0):
<frexp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x3d0,%rsp
movsd  %xmm0,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm0,%xmm0
jp     113e <frexp+0x3e>
movsd  -0x10(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jne    1157 <frexp+0x57>
jp     1157 <frexp+0x57>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    14dc <frexp+0x3dc>
movl   $0x0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    1194 <frexp+0x94>
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0xffffffff,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xe58(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     133b <frexp+0x23b>
movl   $0x0,-0x424(%rbp)
movsd  0xe4c(%rip),%xmm0
movsd  %xmm0,-0x430(%rbp)
ff
movsd  0xe34(%rip),%xmm0
movsd  %xmm0,-0x438(%rbp)
ff
movsd  -0x10(%rbp),%xmm0
ucomisd -0x430(%rbp),%xmm0
ff
jb     1219 <frexp+0x119>
mov    -0x424(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsd  -0x438(%rbp),%xmm0
ff
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    121e <frexp+0x11e>
jmp    1292 <frexp+0x192>
movsd  -0x430(%rbp),%xmm0
ff
movslq -0x424(%rbp),%rax
movsd  %xmm0,-0x220(%rbp,%rax,8)
ff ff
movsd  -0x438(%rbp),%xmm0
ff
movslq -0x424(%rbp),%rax
movsd  %xmm0,-0x420(%rbp,%rax,8)
ff ff
mov    -0x424(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x424(%rbp)
movsd  -0x430(%rbp),%xmm0
ff
mulsd  -0x430(%rbp),%xmm0
ff
movsd  %xmm0,-0x430(%rbp)
ff
movsd  -0x438(%rbp),%xmm0
ff
mulsd  -0x438(%rbp),%xmm0
ff
movsd  %xmm0,-0x438(%rbp)
ff
jmp    11dc <frexp+0xdc>
jmp    1297 <frexp+0x197>
xor    %eax,%eax
cmpl   $0x0,-0x424(%rbp)
mov    %al,-0x449(%rbp)
jle    12d2 <frexp+0x1d2>
movsd  -0x10(%rbp),%xmm1
mov    -0x424(%rbp),%eax
sub    $0x1,%eax
cltq
movsd  -0x220(%rbp,%rax,8),%xmm0
ff ff
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x449(%rbp)
mov    -0x449(%rbp),%al
test   $0x1,%al
jne    12e5 <frexp+0x1e5>
jmp    1311 <frexp+0x211>
mov    -0x424(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x424(%rbp)
movslq -0x424(%rbp),%rax
movsd  -0x420(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x438(%rbp)
ff
jmp    1297 <frexp+0x197>
mov    -0x424(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsd  -0x438(%rbp),%xmm0
ff
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1428 <frexp+0x328>
movl   $0x0,-0x424(%rbp)
movsd  0xcc3(%rip),%xmm0
movsd  %xmm0,-0x440(%rbp)
ff
movsd  0xcab(%rip),%xmm0
movsd  %xmm0,-0x448(%rbp)
ff
movsd  -0x10(%rbp),%xmm1
movsd  -0x448(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jbe    13aa <frexp+0x2aa>
mov    -0x424(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
mov    -0x20(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
movsd  -0x440(%rbp),%xmm0
ff
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    13af <frexp+0x2af>
jmp    1423 <frexp+0x323>
movsd  -0x440(%rbp),%xmm0
ff
movslq -0x424(%rbp),%rax
movsd  %xmm0,-0x220(%rbp,%rax,8)
ff ff
movsd  -0x448(%rbp),%xmm0
ff
movslq -0x424(%rbp),%rax
movsd  %xmm0,-0x420(%rbp,%rax,8)
ff ff
mov    -0x424(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x424(%rbp)
movsd  -0x440(%rbp),%xmm0
ff
mulsd  -0x440(%rbp),%xmm0
ff
movsd  %xmm0,-0x440(%rbp)
ff
movsd  -0x448(%rbp),%xmm0
ff
mulsd  -0x448(%rbp),%xmm0
ff
movsd  %xmm0,-0x448(%rbp)
ff
jmp    1365 <frexp+0x265>
jmp    1428 <frexp+0x328>
jmp    142d <frexp+0x32d>
cmpl   $0x0,-0x424(%rbp)
jle    149e <frexp+0x39e>
mov    -0x424(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x424(%rbp)
movsd  -0x10(%rbp),%xmm1
movslq -0x424(%rbp),%rax
movsd  -0x420(%rbp,%rax,8),%xmm0
ff ff
ucomisd %xmm1,%xmm0
jbe    1499 <frexp+0x399>
mov    -0x424(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,%ecx
mov    -0x20(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
movslq -0x424(%rbp),%rax
movsd  -0x220(%rbp,%rax,8),%xmm0
ff ff
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    142d <frexp+0x32d>
cmpl   $0x0,-0x1c(%rbp)
jge    14c9 <frexp+0x3c9>
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x20(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x3d0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<frexp>:
sub    $0x388,%rsp
xor    %r10d,%r10d
ucomisd %xmm0,%xmm0
jp     12e8 <frexp+0x1e8>
movapd %xmm0,%xmm1
addsd  %xmm0,%xmm1
ucomisd %xmm0,%xmm1
jne    1128 <frexp+0x28>
jnp    12e8 <frexp+0x1e8>
movapd 0xed0(%rip),%xmm2
xorpd  %xmm0,%xmm2
xorpd  %xmm3,%xmm3
movapd %xmm0,%xmm1
cmpltsd %xmm3,%xmm1
andpd  %xmm1,%xmm2
andnpd %xmm0,%xmm1
orpd   %xmm2,%xmm1
ucomisd 0xecb(%rip),%xmm1
jae    11c2 <frexp+0xc2>
xor    %r10d,%r10d
movsd  0xec6(%rip),%xmm2
ucomisd %xmm1,%xmm2
jbe    12c7 <frexp+0x1c7>
movapd 0xe9c(%rip),%xmm2
xor    %eax,%eax
xor    %r10d,%r10d
nopl   0x0(%rax)
mov    $0xffffffff,%edx
mov    %eax,%ecx
shl    %cl,%edx
add    %edx,%r10d
movapd %xmm2,%xmm3
unpckhpd %xmm2,%xmm3
mulsd  %xmm3,%xmm1
movhpd %xmm2,0x180(%rsp,%rax,8)
movlpd %xmm2,-0x80(%rsp,%rax,8)
add    $0x1,%rax
mulpd  %xmm2,%xmm2
ucomisd %xmm1,%xmm2
ja     1180 <frexp+0x80>
test   %eax,%eax
jg     128f <frexp+0x18f>
jmp    12c7 <frexp+0x1c7>
ucomisd 0xe66(%rip),%xmm1
jae    11dd <frexp+0xdd>
movsd  0xe54(%rip),%xmm2
xor    %edx,%edx
xor    %eax,%eax
jmp    1279 <frexp+0x179>
xor    %eax,%eax
movsd  0xe49(%rip),%xmm3
movsd  0xe39(%rip),%xmm2
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    $0x1,%esi
mov    %eax,%ecx
shl    %cl,%esi
add    %esi,%edx
mulsd  %xmm2,%xmm1
movsd  %xmm3,0x180(%rsp,%rax,8)
movsd  %xmm2,-0x80(%rsp,%rax,8)
add    $0x1,%rax
mulsd  %xmm3,%xmm3
mulsd  %xmm2,%xmm2
ucomisd %xmm3,%xmm1
jae    1200 <frexp+0x100>
test   %eax,%eax
jle    1279 <frexp+0x179>
lea    -0x1(%rax),%ecx
movsd  0x180(%rsp,%rcx,8),%xmm3
mov    %eax,%eax
ucomisd %xmm1,%xmm3
jbe    1279 <frexp+0x179>
nopl   0x0(%rax,%rax,1)
mov    %rcx,%rsi
cmp    $0x1,%rax
jbe    135b <frexp+0x25b>
lea    -0x2(%rax),%ecx
movsd  0x180(%rsp,%rcx,8),%xmm2
add    $0xffffffffffffffff,%rax
ucomisd %xmm1,%xmm2
ja     1250 <frexp+0x150>
movsd  -0x80(%rsp,%rsi,8),%xmm2
mulsd  %xmm2,%xmm1
mov    $0x1,%r10d
mov    %eax,%ecx
shl    %cl,%r10d
add    %edx,%r10d
test   %eax,%eax
jle    12c7 <frexp+0x1c7>
mov    %eax,%edx
test   $0x1,%dl
je     12c2 <frexp+0x1c2>
add    $0xffffffffffffffff,%rdx
mov    %edx,%r8d
movsd  -0x80(%rsp,%r8,8),%xmm2
ucomisd %xmm1,%xmm2
jbe    12c2 <frexp+0x1c2>
mov    $0xffffffff,%r9d
mov    %edx,%ecx
shl    %cl,%r9d
add    %r9d,%r10d
mulsd  0x180(%rsp,%r8,8),%xmm1
cmp    $0x1,%eax
jne    12f3 <frexp+0x1f3>
movapd 0xd31(%rip),%xmm2
xorpd  %xmm1,%xmm2
xorpd  %xmm3,%xmm3
cmpltsd %xmm3,%xmm0
andpd  %xmm0,%xmm2
andnpd %xmm1,%xmm0
orpd   %xmm2,%xmm0
mov    %r10d,(%rdi)
add    $0x388,%rsp
ret
add    $0xfffffffffffffffe,%rdx
jmp    1311 <frexp+0x211>
nopl   0x0(%rax)
lea    -0x2(%rdx),%rax
add    $0x1,%rdx
cmp    $0x1,%rdx
mov    %rax,%rdx
jbe    12c7 <frexp+0x1c7>
lea    0x1(%rdx),%eax
movsd  -0x80(%rsp,%rax,8),%xmm2
ucomisd %xmm1,%xmm2
jbe    1336 <frexp+0x236>
lea    0x1(%rdx),%ecx
mov    $0xffffffff,%esi
shl    %cl,%esi
add    %esi,%r10d
mulsd  0x180(%rsp,%rax,8),%xmm1
mov    %edx,%eax
movsd  -0x80(%rsp,%rax,8),%xmm2
ucomisd %xmm1,%xmm2
jbe    1300 <frexp+0x200>
mov    $0xffffffff,%esi
mov    %edx,%ecx
shl    %cl,%esi
add    %esi,%r10d
mulsd  0x180(%rsp,%rax,8),%xmm1
jmp    1300 <frexp+0x200>
movsd  -0x80(%rsp,%rsi,8),%xmm2
jmp    11d6 <frexp+0xd6>

LLVM IR (-O0):
define double @frexp(double %0, i32* %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca [64 x double]
%9 = alloca [64 x double]
%10 = alloca i32
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
store double %0, double* %4
store i32* %1, i32** %5
%15 = load double, double* %4
%16 = fcmp uno double %15, %15
br i1 %16, label %23, label %17
17: ; preds = %2
%18 = load double, double* %4
%19 = load double, double* %4
%20 = fadd double %18, %19
%21 = load double, double* %4
%22 = fcmp oeq double %20, %21
br i1 %22, label %23, label %26
23: ; preds = %17, %2
%24 = load i32*, i32** %5
store i32 0, i32* %24
%25 = load double, double* %4
store double %25, double* %3
br label %164
26: ; preds = %17
store i32 0, i32* %6
%27 = load double, double* %4
%28 = fcmp olt double %27, 0.000000e+00
br i1 %28, label %29, label %32
29: ; preds = %26
%30 = load double, double* %4
%31 = fneg double %30
store double %31, double* %4
store i32 -1, i32* %6
br label %32
32: ; preds = %29, %26
store i32 0, i32* %7
%33 = load double, double* %4
%34 = fcmp oge double %33, 1.000000e+00
br i1 %34, label %35, label %96
35: ; preds = %32
store i32 0, i32* %10
store double 2.000000e+00, double* %11
store double 5.000000e-01, double* %12
br label %36
36: ; preds = %58, %35
%37 = load double, double* %4
%38 = load double, double* %11
%39 = fcmp oge double %37, %38
br i1 %39, label %40, label %48
40: ; preds = %36
%41 = load i32, i32* %10
%42 = shl i32 1, %41
%43 = load i32, i32* %7
%44 = add nsw i32 %43, %42
store i32 %44, i32* %7
%45 = load double, double* %12
%46 = load double, double* %4
%47 = fmul double %46, %45
store double %47, double* %4
br label %49
48: ; preds = %36
br label %67
49: ; preds = %40
%50 = load double, double* %11
%51 = load i32, i32* %10
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 %52
store double %50, double* %53
%54 = load double, double* %12
%55 = load i32, i32* %10
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 %56
store double %54, double* %57
br label %58
58: ; preds = %49
%59 = load i32, i32* %10
%60 = add nsw i32 %59, 1
store i32 %60, i32* %10
%61 = load double, double* %11
%62 = load double, double* %11
%63 = fmul double %61, %62
store double %63, double* %11
%64 = load double, double* %12
%65 = load double, double* %12
%66 = fmul double %64, %65
store double %66, double* %12
br label %36
67: ; preds = %48
br label %68
68: ; preds = %81, %67
%69 = load i32, i32* %10
%70 = icmp sgt i32 %69, 0
br i1 %70, label %71, label %79
71: ; preds = %68
%72 = load double, double* %4
%73 = load i32, i32* %10
%74 = sub nsw i32 %73, 1
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 %75
%77 = load double, double* %76
%78 = fcmp olt double %72, %77
br label %79
79: ; preds = %71, %68
%80 = phi i1 [ false, %68 ], [ %78, %71 ]
br i1 %80, label %81, label %88
81: ; preds = %79
%82 = load i32, i32* %10
%83 = add nsw i32 %82, -1
store i32 %83, i32* %10
%84 = load i32, i32* %10
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 %85
%87 = load double, double* %86
store double %87, double* %12
br label %68
88: ; preds = %79
%89 = load i32, i32* %10
%90 = shl i32 1, %89
%91 = load i32, i32* %7
%92 = add nsw i32 %91, %90
store i32 %92, i32* %7
%93 = load double, double* %12
%94 = load double, double* %4
%95 = fmul double %94, %93
store double %95, double* %4
br label %129
96: ; preds = %32
store i32 0, i32* %10
store double 2.000000e+00, double* %13
store double 5.000000e-01, double* %14
br label %97
97: ; preds = %119, %96
%98 = load double, double* %4
%99 = load double, double* %14
%100 = fcmp olt double %98, %99
br i1 %100, label %101, label %109
101: ; preds = %97
%102 = load i32, i32* %10
%103 = shl i32 1, %102
%104 = load i32, i32* %7
%105 = sub nsw i32 %104, %103
store i32 %105, i32* %7
%106 = load double, double* %13
%107 = load double, double* %4
%108 = fmul double %107, %106
store double %108, double* %4
br label %110
109: ; preds = %97
br label %128
110: ; preds = %101
%111 = load double, double* %13
%112 = load i32, i32* %10
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 %113
store double %111, double* %114
%115 = load double, double* %14
%116 = load i32, i32* %10
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 %117
store double %115, double* %118
br label %119
119: ; preds = %110
%120 = load i32, i32* %10
%121 = add nsw i32 %120, 1
store i32 %121, i32* %10
%122 = load double, double* %13
%123 = load double, double* %13
%124 = fmul double %122, %123
store double %124, double* %13
%125 = load double, double* %14
%126 = load double, double* %14
%127 = fmul double %125, %126
store double %127, double* %14
br label %97
128: ; preds = %109
br label %129
129: ; preds = %128, %88
br label %130
130: ; preds = %153, %129
%131 = load i32, i32* %10
%132 = icmp sgt i32 %131, 0
br i1 %132, label %133, label %154
133: ; preds = %130
%134 = load i32, i32* %10
%135 = add nsw i32 %134, -1
store i32 %135, i32* %10
%136 = load double, double* %4
%137 = load i32, i32* %10
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 %138
%140 = load double, double* %139
%141 = fcmp olt double %136, %140
br i1 %141, label %142, label %153
142: ; preds = %133
%143 = load i32, i32* %10
%144 = shl i32 1, %143
%145 = load i32, i32* %7
%146 = sub nsw i32 %145, %144
store i32 %146, i32* %7
%147 = load i32, i32* %10
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 %148
%150 = load double, double* %149
%151 = load double, double* %4
%152 = fmul double %151, %150
store double %152, double* %4
br label %153
153: ; preds = %142, %133
br label %130
154: ; preds = %130
%155 = load i32, i32* %6
%156 = icmp slt i32 %155, 0
br i1 %156, label %157, label %160
157: ; preds = %154
%158 = load double, double* %4
%159 = fneg double %158
store double %159, double* %4
br label %160
160: ; preds = %157, %154
%161 = load i32, i32* %7
%162 = load i32*, i32** %5
store i32 %161, i32* %162
%163 = load double, double* %4
store double %163, double* %3
br label %164
164: ; preds = %160, %23
%165 = load double, double* %3
ret double %165
}

LLVM IR (-O2):
define double @frexp(double %0, i32* nocapture writeonly %1) {
%3 = alloca [64 x double]
%4 = alloca [64 x double]
%5 = fcmp uno double %0, 0.000000e+00
%6 = fadd double %0, %0
%7 = fcmp oeq double %6, %0
%8 = or i1 %5, %7
br i1 %8, label %163, label %9
9: ; preds = %2
%10 = fcmp olt double %0, 0.000000e+00
%11 = fneg double %0
%12 = select i1 %10, double %11, double %0
%13 = bitcast [64 x double]* %3 to i8*
%14 = bitcast [64 x double]* %4 to i8*
%15 = fcmp ult double %12, 1.000000e+00
br i1 %15, label %18, label %16
16: ; preds = %9
%17 = fcmp ult double %12, 2.000000e+00
br i1 %17, label %67, label %30
18: ; preds = %9
%19 = fcmp olt double %12, 5.000000e-01
br i1 %19, label %75, label %158
20: ; preds = %30
%21 = trunc i64 %42 to i32
%22 = icmp sgt i32 %21, 0
br i1 %22, label %23, label %67
23: ; preds = %20
%24 = and i64 %42, 4294967295
%25 = add nsw i64 %24, -1
%26 = and i64 %25, 4294967295
%27 = getelementptr inbounds [64 x double], [64 x double]* %3, i64 0, i64 %26
%28 = load double, double* %27
%29 = fcmp olt double %39, %28
br i1 %29, label %52, label %60
30: ; preds = %16, %30
%31 = phi i64 [ %42, %30 ], [ 0, %16 ]
%32 = phi double [ %44, %30 ], [ 5.000000e-01, %16 ]
%33 = phi double [ %43, %30 ], [ 2.000000e+00, %16 ]
%34 = phi i32 [ %38, %30 ], [ 0, %16 ]
%35 = phi double [ %39, %30 ], [ %12, %16 ]
%36 = trunc i64 %31 to i32
%37 = shl nuw i32 1, %36
%38 = add nsw i32 %37, %34
%39 = fmul double %35, %32
%40 = getelementptr inbounds [64 x double], [64 x double]* %3, i64 0, i64 %31
store double %33, double* %40
%41 = getelementptr inbounds [64 x double], [64 x double]* %4, i64 0, i64 %31
store double %32, double* %41
%42 = add nuw i64 %31, 1
%43 = fmul double %33, %33
%44 = fmul double %32, %32
%45 = fcmp ult double %39, %43
br i1 %45, label %20, label %30
46: ; preds = %52
%47 = add nsw i64 %54, -1
%48 = and i64 %47, 4294967295
%49 = getelementptr inbounds [64 x double], [64 x double]* %3, i64 0, i64 %48
%50 = load double, double* %49
%51 = fcmp olt double %39, %50
br i1 %51, label %52, label %57
52: ; preds = %23, %46
%53 = phi i64 [ %48, %46 ], [ %26, %23 ]
%54 = phi i64 [ %47, %46 ], [ %25, %23 ]
%55 = phi i64 [ %54, %46 ], [ %24, %23 ]
%56 = icmp ugt i64 %55, 1
br i1 %56, label %46, label %64
57: ; preds = %46
%58 = getelementptr inbounds [64 x double], [64 x double]* %4, i64 0, i64 %53
%59 = load double, double* %58
br label %60
60: ; preds = %57, %23
%61 = phi i64 [ %24, %23 ], [ %54, %57 ]
%62 = phi double [ %44, %23 ], [ %59, %57 ]
%63 = trunc i64 %61 to i32
br label %67
64: ; preds = %52
%65 = getelementptr inbounds [64 x double], [64 x double]* %4, i64 0, i64 %53
%66 = load double, double* %65
br label %67
67: ; preds = %64, %60, %16, %20
%68 = phi i32 [ %38, %20 ], [ 0, %16 ], [ %38, %60 ], [ %38, %64 ]
%69 = phi double [ %39, %20 ], [ %12, %16 ], [ %39, %60 ], [ %39, %64 ]
%70 = phi i32 [ %21, %20 ], [ 0, %16 ], [ %63, %60 ], [ 0, %64 ]
%71 = phi double [ %44, %20 ], [ 5.000000e-01, %16 ], [ %62, %60 ], [ %66, %64 ]
%72 = shl nuw i32 1, %70
%73 = add nsw i32 %72, %68
%74 = fmul double %69, %71
br label %94
75: ; preds = %18, %75
%76 = phi i64 [ %88, %75 ], [ 0, %18 ]
%77 = phi i32 [ %82, %75 ], [ 0, %18 ]
%78 = phi double [ %84, %75 ], [ %12, %18 ]
%79 = phi <2 x double> [ %89, %75 ], [ <double 5.000000e-01, double 2.000000e+00>, %18 ]
%80 = trunc i64 %76 to i32
%81 = shl nsw i32 -1, %80
%82 = add i32 %81, %77
%83 = extractelement <2 x double> %79, i64 1
%84 = fmul double %78, %83
%85 = getelementptr inbounds [64 x double], [64 x double]* %3, i64 0, i64 %76
store double %83, double* %85
%86 = getelementptr inbounds [64 x double], [64 x double]* %4, i64 0, i64 %76
%87 = extractelement <2 x double> %79, i64 0
store double %87, double* %86
%88 = add nuw i64 %76, 1
%89 = fmul <2 x double> %79, %79
%90 = extractelement <2 x double> %89, i64 0
%91 = fcmp olt double %84, %90
br i1 %91, label %75, label %92
92: ; preds = %75
%93 = trunc i64 %88 to i32
br label %94
94: ; preds = %92, %67
%95 = phi double [ %74, %67 ], [ %84, %92 ]
%96 = phi i32 [ %73, %67 ], [ %82, %92 ]
%97 = phi i32 [ %70, %67 ], [ %93, %92 ]
%98 = icmp sgt i32 %97, 0
br i1 %98, label %99, label %158
99: ; preds = %94
%100 = zext i32 %97 to i64
%101 = and i64 %100, 1
%102 = icmp eq i64 %101, 0
br i1 %102, label %116, label %103
103: ; preds = %99
%104 = add nsw i64 %100, -1
%105 = and i64 %104, 4294967295
%106 = getelementptr inbounds [64 x double], [64 x double]* %4, i64 0, i64 %105
%107 = load double, double* %106
%108 = fcmp olt double %95, %107
br i1 %108, label %109, label %116
109: ; preds = %103
%110 = trunc i64 %104 to i32
%111 = shl nsw i32 -1, %110
%112 = add i32 %111, %96
%113 = getelementptr inbounds [64 x double], [64 x double]* %3, i64 0, i64 %105
%114 = load double, double* %113
%115 = fmul double %95, %114
br label %116
116: ; preds = %103, %109, %99
%117 = phi i64 [ %100, %99 ], [ %104, %109 ], [ %104, %103 ]
%118 = phi i32 [ %96, %99 ], [ %112, %109 ], [ %96, %103 ]
%119 = phi double [ %95, %99 ], [ %115, %109 ], [ %95, %103 ]
%120 = phi double [ undef, %99 ], [ %115, %109 ], [ %95, %103 ]
%121 = phi i32 [ undef, %99 ], [ %112, %109 ], [ %96, %103 ]
%122 = icmp eq i32 %97, 1
br i1 %122, label %158, label %123
123: ; preds = %116, %154
%124 = phi i64 [ %142, %154 ], [ %117, %116 ]
%125 = phi i32 [ %156, %154 ], [ %118, %116 ]
%126 = phi double [ %155, %154 ], [ %119, %116 ]
%127 = add nsw i64 %124, -1
%128 = and i64 %127, 4294967295
%129 = getelementptr inbounds [64 x double], [64 x double]* %4, i64 0, i64 %128
%130 = load double, double* %129
%131 = fcmp olt double %126, %130
br i1 %131, label %132, label %139
132: ; preds = %123
%133 = trunc i64 %127 to i32
%134 = shl nsw i32 -1, %133
%135 = add i32 %134, %125
%136 = getelementptr inbounds [64 x double], [64 x double]* %3, i64 0, i64 %128
%137 = load double, double* %136
%138 = fmul double %126, %137
br label %139
139: ; preds = %132, %123
%140 = phi double [ %138, %132 ], [ %126, %123 ]
%141 = phi i32 [ %135, %132 ], [ %125, %123 ]
%142 = add nsw i64 %124, -2
%143 = and i64 %142, 4294967295
%144 = getelementptr inbounds [64 x double], [64 x double]* %4, i64 0, i64 %143
%145 = load double, double* %144
%146 = fcmp olt double %140, %145
br i1 %146, label %147, label %154
147: ; preds = %139
%148 = trunc i64 %142 to i32
%149 = shl nsw i32 -1, %148
%150 = add i32 %149, %141
%151 = getelementptr inbounds [64 x double], [64 x double]* %3, i64 0, i64 %143
%152 = load double, double* %151
%153 = fmul double %140, %152
br label %154
154: ; preds = %147, %139
%155 = phi double [ %153, %147 ], [ %140, %139 ]
%156 = phi i32 [ %150, %147 ], [ %141, %139 ]
%157 = icmp ugt i64 %127, 1
br i1 %157, label %123, label %158
158: ; preds = %116, %154, %18, %94
%159 = phi double [ %95, %94 ], [ %12, %18 ], [ %120, %116 ], [ %155, %154 ]
%160 = phi i32 [ %96, %94 ], [ 0, %18 ], [ %121, %116 ], [ %156, %154 ]
%161 = fneg double %159
%162 = select i1 %10, double %161, double %159
br label %163
163: ; preds = %2, %158
%164 = phi i32 [ %160, %158 ], [ 0, %2 ]
%165 = phi double [ %162, %158 ], [ %0, %2 ]
store i32 %164, i32* %1
ret double %165
}