#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
float fabs(float);
int /*<<< orphan*/ nrerror(char *);
float stub1(float);
float stub2(float);
float stub3(float);
float zbrent(float (*func)(float), float x1, float x2, float tol) {
  int iter;
  float a = x1, b = x2, c = x2, d, e, min1, min2;
  float fa = (*func)(a), fb = (*func)(b), fc, p, q, r, s, tol1, xm;
  if ((fa > 0.0 && fb > 0.0) || (fa < 0.0 && fb < 0.0))
    nrerror("Root must be bracketed in zbrent");
  fc = fb;
  for (iter = 1; iter <= 100; iter++) {
    if ((fb > 0.0 && fc > 0.0) || (fb < 0.0 && fc < 0.0)) {
      c = a;
      fc = fa;
      e = d = b - a;
    }
    if (fabs(fc) < fabs(fb)) {
      a = b;
      b = c;
      c = a;
      fa = fb;
      fb = fc;
      fc = fa;
    }
    tol1 = 2.0 * 3.0e-8 * fabs(b) + 0.5 * tol;
    xm = 0.5 * (c - b);
    if (fabs(xm) <= tol1 || fb == 0.0)
      return b;
    if (fabs(e) >= tol1 && fabs(fa) > fabs(fb)) {
      s = fb / fa;
      if (a == c) {
        p = 2.0 * xm * s;
        q = 1.0 - s;
      } else {
        q = fa / fc;
        r = fb / fc;
        p = s * (2.0 * xm * q * (q - r) - (b - a) * (r - 1.0));
        q = (q - 1.0) * (r - 1.0) * (s - 1.0);
      }
      if (p > 0.0)
        q = -q;
      p = fabs(p);
      min1 = 3.0 * xm * q - fabs(tol1 * q);
      min2 = fabs(e * q);
      if (2.0 * p < (min1 < min2 ? min1 : min2)) {
        e = d;
        d = p / q;
      } else {
        d = xm;
        e = d;
      }
    } else {
      d = xm;
      e = d;
    }
    a = b;
    fa = fb;
    if (fabs(d) > tol1)
      b += d;
    else
      b += ((xm) >= 0.0 ? fabs(tol1) : -fabs(tol1));
    fb = (*func)(b);
  }
  nrerror("Maximum number of iterations exceeded in zbrent");
  return 0.0;
}


x86 assembly (clang, -O0):
<zbrent>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
movss  %xmm2,-0x1c(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
movss  -0x24(%rbp),%xmm0
call   *%rax
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  -0x28(%rbp),%xmm0
call   *%rax
movss  %xmm0,-0x44(%rbp)
movss  -0x40(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11a8 <zbrent+0x88>
movss  -0x44(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
ja     11d4 <zbrent+0xb4>
movss  -0x40(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11e0 <zbrent+0xc0>
movss  -0x44(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11e0 <zbrent+0xc0>
lea    0xe4d(%rip),%rdi
call   1030 <nrerror@plt>
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movl   $0x1,-0x20(%rbp)
cmpl   $0x64,-0x20(%rbp)
jg     1757 <zbrent+0x637>
movss  -0x44(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1227 <zbrent+0x107>
movss  -0x48(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
ja     1253 <zbrent+0x133>
movss  -0x44(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    127b <zbrent+0x15b>
movss  -0x48(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    127b <zbrent+0x15b>
movss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
subss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  %xmm0,-0x34(%rbp)
movss  -0x48(%rbp),%xmm0
call   1040 <fabs@plt>
movss  %xmm0,-0x64(%rbp)
movss  -0x44(%rbp),%xmm0
call   1040 <fabs@plt>
movss  -0x64(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jbe    12de <zbrent+0x1be>
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
call   1040 <fabs@plt>
cvtss2sd %xmm0,%xmm0
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd03(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  0xcff(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x5c(%rbp)
movss  -0x2c(%rbp),%xmm0
subss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xcd0(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x60(%rbp)
movss  -0x60(%rbp),%xmm0
call   1040 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0x5c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jae    1374 <zbrent+0x254>
movss  -0x44(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1383 <zbrent+0x263>
jp     1383 <zbrent+0x263>
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    176b <zbrent+0x64b>
movss  -0x34(%rbp),%xmm0
call   1040 <fabs@plt>
ucomiss -0x5c(%rbp),%xmm0
jb     168b <zbrent+0x56b>
movss  -0x40(%rbp),%xmm0
call   1040 <fabs@plt>
movss  %xmm0,-0x68(%rbp)
movss  -0x44(%rbp),%xmm0
call   1040 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0x68(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    168b <zbrent+0x56b>
movss  -0x44(%rbp),%xmm0
divss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x24(%rbp),%xmm0
ucomiss -0x2c(%rbp),%xmm0
jne    1433 <zbrent+0x313>
jp     1433 <zbrent+0x313>
movss  -0x60(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc22(%rip),%xmm0
mulsd  %xmm1,%xmm0
movss  -0x58(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x58(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xbef(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x50(%rbp)
jmp    152d <zbrent+0x40d>
movss  -0x40(%rbp),%xmm0
divss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x44(%rbp),%xmm0
divss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x58(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x60(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xbad(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x50(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
movss  -0x50(%rbp),%xmm2
subss  -0x54(%rbp),%xmm2
cvtss2sd %xmm2,%xmm3
movss  -0x28(%rbp),%xmm2
subss  -0x24(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x54(%rbp),%xmm4
cvtss2sd %xmm4,%xmm4
movsd  0xb67(%rip),%xmm5
subsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm2
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb22(%rip),%xmm1
subsd  %xmm1,%xmm0
movss  -0x54(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xb0d(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movss  -0x58(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xaf4(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    155a <zbrent+0x43a>
movss  -0x50(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x4c(%rbp),%xmm0
call   1040 <fabs@plt>
movss  %xmm0,-0x4c(%rbp)
movss  -0x60(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xaa6(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x80(%rbp)
movss  -0x5c(%rbp),%xmm0
mulss  -0x50(%rbp),%xmm0
call   1040 <fabs@plt>
movsd  -0x80(%rbp),%xmm2
movaps %xmm0,%xmm1
movsd  -0x78(%rbp),%xmm0
cvtss2sd %xmm1,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x34(%rbp),%xmm0
mulss  -0x50(%rbp),%xmm0
call   1040 <fabs@plt>
movss  %xmm0,-0x3c(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xa1a(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movss  -0x38(%rbp),%xmm1
movss  -0x3c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    162c <zbrent+0x50c>
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
jmp    1639 <zbrent+0x519>
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
movsd  -0x70(%rbp),%xmm1
movss  -0x84(%rbp),%xmm0
ff
cvtss2sd %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1672 <zbrent+0x552>
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x4c(%rbp),%xmm0
divss  -0x50(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
jmp    1686 <zbrent+0x566>
movss  -0x60(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
jmp    169f <zbrent+0x57f>
movss  -0x60(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x30(%rbp),%xmm0
call   1040 <fabs@plt>
ucomiss -0x5c(%rbp),%xmm0
jbe    16db <zbrent+0x5bb>
movss  -0x30(%rbp),%xmm0
addss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
jmp    1739 <zbrent+0x619>
movss  -0x60(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1708 <zbrent+0x5e8>
movss  -0x5c(%rbp),%xmm0
call   1040 <fabs@plt>
movss  %xmm0,-0x88(%rbp)
ff
jmp    1727 <zbrent+0x607>
movss  -0x5c(%rbp),%xmm0
call   1040 <fabs@plt>
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x88(%rbp)
ff
movss  -0x88(%rbp),%xmm0
ff
addss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movss  -0x28(%rbp),%xmm0
call   *%rax
movss  %xmm0,-0x44(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11f1 <zbrent+0xd1>
lea    0x8eb(%rip),%rdi
call   1030 <nrerror@plt>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<zbrent>:
push   %rbp
push   %rbx
sub    $0x78,%rsp
movss  %xmm2,0x30(%rsp)
movaps %xmm1,0x10(%rsp)
mov    %rdi,%rbx
movaps %xmm0,0x60(%rsp)
call   *%rdi
movaps %xmm0,0x20(%rsp)
movaps 0x10(%rsp),%xmm0
call   *%rbx
movaps 0x20(%rsp),%xmm1
movaps %xmm0,%xmm12
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jbe    114e <zbrent+0x3e>
ucomiss %xmm0,%xmm12
ja     115c <zbrent+0x4c>
ucomiss %xmm1,%xmm0
jbe    1179 <zbrent+0x69>
xorps  %xmm0,%xmm0
ucomiss %xmm12,%xmm0
jbe    1179 <zbrent+0x69>
lea    0xf01(%rip),%rdi
movaps %xmm12,0x40(%rsp)
call   1030 <nrerror@plt>
movaps 0x40(%rsp),%xmm12
movaps 0x20(%rsp),%xmm1
movss  0x30(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0xe75(%rip),%xmm0
movsd  %xmm0,0x58(%rsp)
mov    $0x64,%ebp
xorps  %xmm13,%xmm13
movaps 0xe8e(%rip),%xmm14
movaps %xmm12,%xmm0
movaps 0x10(%rsp),%xmm10
movaps %xmm10,%xmm2
jmp    1210 <zbrent+0x100>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movss  %xmm5,0x8(%rsp)
movaps %xmm0,0x60(%rsp)
addss  %xmm0,%xmm3
movaps %xmm3,0x10(%rsp)
movaps %xmm3,%xmm0
movaps %xmm1,0x30(%rsp)
call   *%rbx
movaps 0x10(%rsp),%xmm10
movaps 0x30(%rsp),%xmm15
movaps 0xe3e(%rip),%xmm14
xorps  %xmm13,%xmm13
add    $0xffffffff,%ebp
movaps 0x20(%rsp),%xmm1
movaps 0x40(%rsp),%xmm12
movss  0xc(%rsp),%xmm2
je     14bb <zbrent+0x3ab>
ucomiss %xmm13,%xmm0
movaps 0x60(%rsp),%xmm5
jbe    1221 <zbrent+0x111>
ucomiss %xmm13,%xmm12
ja     1238 <zbrent+0x128>
ucomiss %xmm0,%xmm13
jbe    1385 <zbrent+0x275>
ucomiss %xmm12,%xmm13
movss  0x8(%rsp),%xmm11
jbe    124c <zbrent+0x13c>
movaps %xmm10,%xmm15
subss  %xmm5,%xmm15
movaps %xmm15,%xmm11
movaps %xmm5,%xmm2
movaps %xmm1,%xmm12
movaps %xmm12,%xmm3
andps  %xmm14,%xmm3
movaps %xmm0,%xmm4
andps  %xmm14,%xmm4
ucomiss %xmm3,%xmm4
jbe    1280 <zbrent+0x170>
movaps %xmm10,%xmm7
movaps %xmm0,%xmm1
movaps %xmm12,%xmm9
movaps %xmm0,%xmm12
jmp    128f <zbrent+0x17f>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movaps %xmm2,%xmm7
movaps %xmm0,%xmm9
movaps %xmm10,%xmm2
movaps %xmm5,%xmm10
movaps %xmm2,%xmm0
andps  %xmm14,%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  0xd66(%rip),%xmm2
addsd  0x58(%rsp),%xmm2
xorps  %xmm4,%xmm4
cvtsd2ss %xmm2,%xmm4
movaps %xmm7,%xmm2
subss  %xmm0,%xmm2
mulss  0xda2(%rip),%xmm2
movaps %xmm2,%xmm3
andps  %xmm14,%xmm3
ucomiss %xmm3,%xmm4
jae    14ca <zbrent+0x3ba>
ucomiss %xmm13,%xmm9
jne    12da <zbrent+0x1ca>
jnp    14ca <zbrent+0x3ba>
movaps %xmm15,%xmm5
andps  %xmm14,%xmm5
ucomiss %xmm4,%xmm5
movss  %xmm7,0xc(%rsp)
movaps %xmm9,0x20(%rsp)
jb     1350 <zbrent+0x240>
movaps %xmm1,%xmm5
andps  %xmm14,%xmm5
movaps %xmm9,%xmm6
andps  %xmm14,%xmm6
ucomiss %xmm6,%xmm5
jbe    1350 <zbrent+0x240>
movaps %xmm9,%xmm8
divss  %xmm1,%xmm8
ucomiss %xmm7,%xmm10
movss  %xmm11,0x10(%rsp)
jne    1391 <zbrent+0x281>
jp     1391 <zbrent+0x281>
xorps  %xmm11,%xmm11
cvtss2sd %xmm2,%xmm11
movaps %xmm11,%xmm1
addsd  %xmm11,%xmm1
xorps  %xmm7,%xmm7
cvtss2sd %xmm8,%xmm7
mulsd  %xmm7,%xmm1
movsd  0xcd3(%rip),%xmm6
subsd  %xmm7,%xmm6
jmp    1412 <zbrent+0x302>
xchg   %ax,%ax
movaps %xmm2,%xmm1
movaps %xmm2,%xmm5
movaps %xmm12,0x40(%rsp)
ucomiss %xmm4,%xmm3
movaps %xmm5,%xmm3
ja     11c0 <zbrent+0xb0>
ucomiss %xmm13,%xmm2
andps  %xmm14,%xmm4
movaps %xmm4,%xmm3
jae    11c0 <zbrent+0xb0>
xorps  0xcd0(%rip),%xmm3
jmp    11c0 <zbrent+0xb0>
movss  0x8(%rsp),%xmm11
jmp    124c <zbrent+0x13c>
divss  %xmm12,%xmm1
divss  %xmm12,%xmm9
xorps  %xmm11,%xmm11
cvtss2sd %xmm2,%xmm11
movaps %xmm11,%xmm5
addsd  %xmm11,%xmm5
xorps  %xmm6,%xmm6
cvtss2sd %xmm1,%xmm6
mulsd  %xmm6,%xmm5
subss  %xmm9,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm5,%xmm1
movaps %xmm0,%xmm5
subss  %xmm10,%xmm5
xorps  %xmm10,%xmm10
cvtss2sd %xmm5,%xmm10
unpcklps %xmm9,%xmm8
cvtps2pd %xmm8,%xmm9
movapd %xmm9,%xmm5
addpd  0xc55(%rip),%xmm5
movapd %xmm5,%xmm7
unpckhpd %xmm5,%xmm7
mulsd  %xmm7,%xmm10
subsd  %xmm10,%xmm1
mulsd  %xmm9,%xmm1
addsd  0xc06(%rip),%xmm6
mulsd  %xmm7,%xmm6
mulsd  %xmm5,%xmm6
xorps  %xmm5,%xmm5
cvtsd2ss %xmm6,%xmm5
xorps  %xmm9,%xmm9
cvtsd2ss %xmm1,%xmm9
movaps %xmm5,%xmm7
xorps  0xc24(%rip),%xmm7
xorps  %xmm6,%xmm6
cmpltss %xmm9,%xmm6
andps  %xmm6,%xmm7
andnps %xmm5,%xmm6
orps   %xmm7,%xmm6
andps  %xmm14,%xmm9
mulsd  0xbd5(%rip),%xmm11
xorps  %xmm5,%xmm5
cvtss2sd %xmm6,%xmm5
mulsd  %xmm11,%xmm5
movaps %xmm6,%xmm1
mulss  %xmm4,%xmm1
andps  %xmm14,%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm5
xorps  %xmm1,%xmm1
cvtsd2ss %xmm5,%xmm1
mulss  %xmm6,%xmm15
andps  %xmm14,%xmm15
xorps  %xmm5,%xmm5
cvtss2sd %xmm9,%xmm5
addsd  %xmm5,%xmm5
minss  %xmm15,%xmm1
cvtss2sd %xmm1,%xmm1
ucomisd %xmm5,%xmm1
movaps %xmm2,%xmm1
movaps %xmm2,%xmm5
jbe    1356 <zbrent+0x246>
divss  %xmm6,%xmm9
movaps %xmm9,%xmm3
andps  %xmm14,%xmm3
movss  0x10(%rsp),%xmm1
movaps %xmm9,%xmm5
jmp    1356 <zbrent+0x246>
lea    0xbc3(%rip),%rdi
call   1030 <nrerror@plt>
xorps  %xmm0,%xmm0
add    $0x78,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
@.str = [33 x i8] c"Root must be bracketed in zbrent\00"
@.str.1 = [48 x i8] c"Maximum number of iterations exceeded in zbrent\00"
define float @zbrent(float (float)* %0, float %1, float %2, float %3) {
%5 = alloca float
%6 = alloca float (float)*
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca i32
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca float
%22 = alloca float
%23 = alloca float
%24 = alloca float
%25 = alloca float
%26 = alloca float
store float (float)* %0, float (float)** %6
store float %1, float* %7
store float %2, float* %8
store float %3, float* %9
%27 = load float, float* %7
store float %27, float* %11
%28 = load float, float* %8
store float %28, float* %12
%29 = load float, float* %8
store float %29, float* %13
%30 = load float (float)*, float (float)** %6
%31 = load float, float* %11
%32 = call float %30(float %31)
store float %32, float* %18
%33 = load float (float)*, float (float)** %6
%34 = load float, float* %12
%35 = call float %33(float %34)
store float %35, float* %19
%36 = load float, float* %18
%37 = fpext float %36 to double
%38 = fcmp ogt double %37, 0.000000e+00
br i1 %38, label %39, label %43
39: ; preds = %4
%40 = load float, float* %19
%41 = fpext float %40 to double
%42 = fcmp ogt double %41, 0.000000e+00
br i1 %42, label %51, label %43
43: ; preds = %39, %4
%44 = load float, float* %18
%45 = fpext float %44 to double
%46 = fcmp olt double %45, 0.000000e+00
br i1 %46, label %47, label %53
47: ; preds = %43
%48 = load float, float* %19
%49 = fpext float %48 to double
%50 = fcmp olt double %49, 0.000000e+00
br i1 %50, label %51, label %53
51: ; preds = %47, %39
%52 = call i32 @nrerror(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0))
br label %53
53: ; preds = %51, %47, %43
%54 = load float, float* %19
store float %54, float* %20
store i32 1, i32* %10
br label %55
55: ; preds = %274, %53
%56 = load i32, i32* %10
%57 = icmp sle i32 %56, 100
br i1 %57, label %58, label %277
58: ; preds = %55
%59 = load float, float* %19
%60 = fpext float %59 to double
%61 = fcmp ogt double %60, 0.000000e+00
br i1 %61, label %62, label %66
62: ; preds = %58
%63 = load float, float* %20
%64 = fpext float %63 to double
%65 = fcmp ogt double %64, 0.000000e+00
br i1 %65, label %74, label %66
66: ; preds = %62, %58
%67 = load float, float* %19
%68 = fpext float %67 to double
%69 = fcmp olt double %68, 0.000000e+00
br i1 %69, label %70, label %80
70: ; preds = %66
%71 = load float, float* %20
%72 = fpext float %71 to double
%73 = fcmp olt double %72, 0.000000e+00
br i1 %73, label %74, label %80
74: ; preds = %70, %62
%75 = load float, float* %11
store float %75, float* %13
%76 = load float, float* %18
store float %76, float* %20
%77 = load float, float* %12
%78 = load float, float* %11
%79 = fsub float %77, %78
store float %79, float* %14
store float %79, float* %15
br label %80
80: ; preds = %74, %70, %66
%81 = load float, float* %20
%82 = call float @fabs(float %81)
%83 = load float, float* %19
%84 = call float @fabs(float %83)
%85 = fcmp olt float %82, %84
br i1 %85, label %86, label %93
86: ; preds = %80
%87 = load float, float* %12
store float %87, float* %11
%88 = load float, float* %13
store float %88, float* %12
%89 = load float, float* %11
store float %89, float* %13
%90 = load float, float* %19
store float %90, float* %18
%91 = load float, float* %20
store float %91, float* %19
%92 = load float, float* %18
store float %92, float* %20
br label %93
93: ; preds = %86, %80
%94 = load float, float* %12
%95 = call float @fabs(float %94)
%96 = fpext float %95 to double
%97 = load float, float* %9
%98 = fpext float %97 to double
%99 = fmul double 5.000000e-01, %98
%100 = call double @llvm.fmuladd.f64(double 6.000000e-08, double %96, double %99)
%101 = fptrunc double %100 to float
store float %101, float* %25
%102 = load float, float* %13
%103 = load float, float* %12
%104 = fsub float %102, %103
%105 = fpext float %104 to double
%106 = fmul double 5.000000e-01, %105
%107 = fptrunc double %106 to float
store float %107, float* %26
%108 = load float, float* %26
%109 = call float @fabs(float %108)
%110 = load float, float* %25
%111 = fcmp ole float %109, %110
br i1 %111, label %116, label %112
112: ; preds = %93
%113 = load float, float* %19
%114 = fpext float %113 to double
%115 = fcmp oeq double %114, 0.000000e+00
br i1 %115, label %116, label %118
116: ; preds = %112, %93
%117 = load float, float* %12
store float %117, float* %5
br label %279
118: ; preds = %112
%119 = load float, float* %15
%120 = call float @fabs(float %119)
%121 = load float, float* %25
%122 = fcmp oge float %120, %121
br i1 %122, label %123, label %241
123: ; preds = %118
%124 = load float, float* %18
%125 = call float @fabs(float %124)
%126 = load float, float* %19
%127 = call float @fabs(float %126)
%128 = fcmp ogt float %125, %127
br i1 %128, label %129, label %241
129: ; preds = %123
%130 = load float, float* %19
%131 = load float, float* %18
%132 = fdiv float %130, %131
store float %132, float* %24
%133 = load float, float* %11
%134 = load float, float* %13
%135 = fcmp oeq float %133, %134
br i1 %135, label %136, label %148
136: ; preds = %129
%137 = load float, float* %26
%138 = fpext float %137 to double
%139 = fmul double 2.000000e+00, %138
%140 = load float, float* %24
%141 = fpext float %140 to double
%142 = fmul double %139, %141
%143 = fptrunc double %142 to float
store float %143, float* %21
%144 = load float, float* %24
%145 = fpext float %144 to double
%146 = fsub double 1.000000e+00, %145
%147 = fptrunc double %146 to float
store float %147, float* %22
br label %191
148: ; preds = %129
%149 = load float, float* %18
%150 = load float, float* %20
%151 = fdiv float %149, %150
store float %151, float* %22
%152 = load float, float* %19
%153 = load float, float* %20
%154 = fdiv float %152, %153
store float %154, float* %23
%155 = load float, float* %24
%156 = fpext float %155 to double
%157 = load float, float* %26
%158 = fpext float %157 to double
%159 = fmul double 2.000000e+00, %158
%160 = load float, float* %22
%161 = fpext float %160 to double
%162 = fmul double %159, %161
%163 = load float, float* %22
%164 = load float, float* %23
%165 = fsub float %163, %164
%166 = fpext float %165 to double
%167 = load float, float* %12
%168 = load float, float* %11
%169 = fsub float %167, %168
%170 = fpext float %169 to double
%171 = load float, float* %23
%172 = fpext float %171 to double
%173 = fsub double %172, 1.000000e+00
%174 = fmul double %170, %173
%175 = fneg double %174
%176 = call double @llvm.fmuladd.f64(double %162, double %166, double %175)
%177 = fmul double %156, %176
%178 = fptrunc double %177 to float
store float %178, float* %21
%179 = load float, float* %22
%180 = fpext float %179 to double
%181 = fsub double %180, 1.000000e+00
%182 = load float, float* %23
%183 = fpext float %182 to double
%184 = fsub double %183, 1.000000e+00
%185 = fmul double %181, %184
%186 = load float, float* %24
%187 = fpext float %186 to double
%188 = fsub double %187, 1.000000e+00
%189 = fmul double %185, %188
%190 = fptrunc double %189 to float
store float %190, float* %22
br label %191
191: ; preds = %148, %136
%192 = load float, float* %21
%193 = fpext float %192 to double
%194 = fcmp ogt double %193, 0.000000e+00
br i1 %194, label %195, label %198
195: ; preds = %191
%196 = load float, float* %22
%197 = fneg float %196
store float %197, float* %22
br label %198
198: ; preds = %195, %191
%199 = load float, float* %21
%200 = call float @fabs(float %199)
store float %200, float* %21
%201 = load float, float* %26
%202 = fpext float %201 to double
%203 = fmul double 3.000000e+00, %202
%204 = load float, float* %22
%205 = fpext float %204 to double
%206 = load float, float* %25
%207 = load float, float* %22
%208 = fmul float %206, %207
%209 = call float @fabs(float %208)
%210 = fpext float %209 to double
%211 = fneg double %210
%212 = call double @llvm.fmuladd.f64(double %203, double %205, double %211)
%213 = fptrunc double %212 to float
store float %213, float* %16
%214 = load float, float* %15
%215 = load float, float* %22
%216 = fmul float %214, %215
%217 = call float @fabs(float %216)
store float %217, float* %17
%218 = load float, float* %21
%219 = fpext float %218 to double
%220 = fmul double 2.000000e+00, %219
%221 = load float, float* %16
%222 = load float, float* %17
%223 = fcmp olt float %221, %222
br i1 %223, label %224, label %226
224: ; preds = %198
%225 = load float, float* %16
br label %228
226: ; preds = %198
%227 = load float, float* %17
br label %228
228: ; preds = %226, %224
%229 = phi float [ %225, %224 ], [ %227, %226 ]
%230 = fpext float %229 to double
%231 = fcmp olt double %220, %230
br i1 %231, label %232, label %237
232: ; preds = %228
%233 = load float, float* %14
store float %233, float* %15
%234 = load float, float* %21
%235 = load float, float* %22
%236 = fdiv float %234, %235
store float %236, float* %14
br label %240
237: ; preds = %228
%238 = load float, float* %26
store float %238, float* %14
%239 = load float, float* %14
store float %239, float* %15
br label %240
240: ; preds = %237, %232
br label %244
241: ; preds = %123, %118
%242 = load float, float* %26
store float %242, float* %14
%243 = load float, float* %14
store float %243, float* %15
br label %244
244: ; preds = %241, %240
%245 = load float, float* %12
store float %245, float* %11
%246 = load float, float* %19
store float %246, float* %18
%247 = load float, float* %14
%248 = call float @fabs(float %247)
%249 = load float, float* %25
%250 = fcmp ogt float %248, %249
br i1 %250, label %251, label %255
251: ; preds = %244
%252 = load float, float* %14
%253 = load float, float* %12
%254 = fadd float %253, %252
store float %254, float* %12
br label %270
255: ; preds = %244
%256 = load float, float* %26
%257 = fpext float %256 to double
%258 = fcmp oge double %257, 0.000000e+00
br i1 %258, label %259, label %262
259: ; preds = %255
%260 = load float, float* %25
%261 = call float @fabs(float %260)
br label %266
262: ; preds = %255
%263 = load float, float* %25
%264 = call float @fabs(float %263)
%265 = fneg float %264
br label %266
266: ; preds = %262, %259
%267 = phi float [ %261, %259 ], [ %265, %262 ]
%268 = load float, float* %12
%269 = fadd float %268, %267
store float %269, float* %12
br label %270
270: ; preds = %266, %251
%271 = load float (float)*, float (float)** %6
%272 = load float, float* %12
%273 = call float %271(float %272)
store float %273, float* %19
br label %274
274: ; preds = %270
%275 = load i32, i32* %10
%276 = add nsw i32 %275, 1
store i32 %276, i32* %10
br label %55
277: ; preds = %55
%278 = call i32 @nrerror(i8* getelementptr inbounds ([48 x i8], [48 x i8]* @.str.1, i64 0, i64 0))
store float 0.000000e+00, float* %5
br label %279
279: ; preds = %277, %116
%280 = load float, float* %5
ret float %280
}

LLVM IR (-O2):
@.str = [33 x i8] c"Root must be bracketed in zbrent\00"
@.str.1 = [48 x i8] c"Maximum number of iterations exceeded in zbrent\00"
define float @zbrent(float (float)* nocapture %0, float %1, float %2, float %3) {
%5 = tail call float %0(float %1)
%6 = tail call float %0(float %2)
%7 = fcmp ogt float %5, 0.000000e+00
%8 = fcmp ogt float %6, 0.000000e+00
%9 = select i1 %7, i1 %8, i1 false
br i1 %9, label %14, label %10
10: ; preds = %4
%11 = fcmp olt float %5, 0.000000e+00
%12 = fcmp olt float %6, 0.000000e+00
%13 = select i1 %11, i1 %12, i1 false
br i1 %13, label %14, label %16
14: ; preds = %10, %4
%15 = tail call i32 @nrerror(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0))
br label %16
16: ; preds = %14, %10
%17 = fpext float %3 to double
%18 = fmul double %17, 5.000000e-01
br label %19
19: ; preds = %16, %144
%20 = phi i32 [ 1, %16 ], [ %148, %144 ]
%21 = phi float [ %1, %16 ], [ %52, %144 ]
%22 = phi float [ %2, %16 ], [ %146, %144 ]
%23 = phi float [ %6, %16 ], [ %51, %144 ]
%24 = phi float [ %6, %16 ], [ %147, %144 ]
%25 = phi float [ %5, %16 ], [ %50, %144 ]
%26 = phi float [ %2, %16 ], [ %48, %144 ]
%27 = phi float [ undef, %16 ], [ %137, %144 ]
%28 = phi float [ undef, %16 ], [ %136, %144 ]
%29 = fcmp ogt float %24, 0.000000e+00
%30 = fcmp ogt float %23, 0.000000e+00
%31 = select i1 %29, i1 %30, i1 false
br i1 %31, label %36, label %32
32: ; preds = %19
%33 = fcmp olt float %24, 0.000000e+00
%34 = fcmp olt float %23, 0.000000e+00
%35 = select i1 %33, i1 %34, i1 false
br i1 %35, label %36, label %38
36: ; preds = %32, %19
%37 = fsub float %22, %21
br label %38
38: ; preds = %36, %32
%39 = phi float [ %37, %36 ], [ %28, %32 ]
%40 = phi float [ %37, %36 ], [ %27, %32 ]
%41 = phi float [ %21, %36 ], [ %26, %32 ]
%42 = phi float [ %25, %36 ], [ %23, %32 ]
%43 = tail call float @llvm.fabs.f32(float %42)
%44 = tail call float @llvm.fabs.f32(float %24)
%45 = fcmp olt float %43, %44
br i1 %45, label %46, label %47
46: ; preds = %38
br label %47
47: ; preds = %46, %38
%48 = phi float [ %22, %46 ], [ %41, %38 ]
%49 = phi float [ %24, %46 ], [ %25, %38 ]
%50 = phi float [ %42, %46 ], [ %24, %38 ]
%51 = phi float [ %24, %46 ], [ %42, %38 ]
%52 = phi float [ %41, %46 ], [ %22, %38 ]
%53 = phi float [ %22, %46 ], [ %21, %38 ]
%54 = tail call float @llvm.fabs.f32(float %52)
%55 = fpext float %54 to double
%56 = tail call double @llvm.fmuladd.f64(double %55, double 6.000000e-08, double %18)
%57 = fptrunc double %56 to float
%58 = fsub float %48, %52
%59 = fmul float %58, 5.000000e-01
%60 = tail call float @llvm.fabs.f32(float %59)
%61 = fcmp ole float %60, %57
%62 = fcmp oeq float %50, 0.000000e+00
%63 = select i1 %61, i1 true, i1 %62
br i1 %63, label %152, label %64
64: ; preds = %47
%65 = tail call float @llvm.fabs.f32(float %39)
%66 = fcmp ult float %65, %57
br i1 %66, label %134, label %67
67: ; preds = %64
%68 = tail call float @llvm.fabs.f32(float %49)
%69 = tail call float @llvm.fabs.f32(float %50)
%70 = fcmp ogt float %68, %69
br i1 %70, label %71, label %134
71: ; preds = %67
%72 = fdiv float %50, %49
%73 = fcmp oeq float %53, %48
br i1 %73, label %74, label %80
74: ; preds = %71
%75 = fpext float %59 to double
%76 = fmul double %75, 2.000000e+00
%77 = fpext float %72 to double
%78 = fmul double %76, %77
%79 = fsub double 1.000000e+00, %77
br label %105
80: ; preds = %71
%81 = fdiv float %49, %51
%82 = fdiv float %50, %51
%83 = fpext float %59 to double
%84 = fmul double %83, 2.000000e+00
%85 = fpext float %81 to double
%86 = fmul double %84, %85
%87 = fsub float %81, %82
%88 = fpext float %87 to double
%89 = fsub float %52, %53
%90 = fpext float %89 to double
%91 = insertelement <2 x float> poison, float %72, i64 0
%92 = insertelement <2 x float> %91, float %82, i64 1
%93 = fpext <2 x float> %92 to <2 x double>
%94 = fadd <2 x double> %93, <double -1.000000e+00, double -1.000000e+00>
%95 = extractelement <2 x double> %94, i64 1
%96 = fneg double %95
%97 = fmul double %96, %90
%98 = tail call double @llvm.fmuladd.f64(double %86, double %88, double %97)
%99 = extractelement <2 x double> %93, i64 0
%100 = fmul double %98, %99
%101 = fadd double %85, -1.000000e+00
%102 = fmul double %101, %95
%103 = extractelement <2 x double> %94, i64 0
%104 = fmul double %103, %102
br label %105
105: ; preds = %80, %74
%106 = phi double [ %83, %80 ], [ %75, %74 ]
%107 = phi double [ %100, %80 ], [ %78, %74 ]
%108 = phi double [ %104, %80 ], [ %79, %74 ]
%109 = fptrunc double %108 to float
%110 = fptrunc double %107 to float
%111 = fcmp ogt float %110, 0.000000e+00
%112 = fneg float %109
%113 = select i1 %111, float %112, float %109
%114 = tail call float @llvm.fabs.f32(float %110)
%115 = fmul double %106, 3.000000e+00
%116 = fpext float %113 to double
%117 = fmul float %113, %57
%118 = tail call float @llvm.fabs.f32(float %117)
%119 = fpext float %118 to double
%120 = fneg double %119
%121 = tail call double @llvm.fmuladd.f64(double %115, double %116, double %120)
%122 = fptrunc double %121 to float
%123 = fmul float %39, %113
%124 = tail call float @llvm.fabs.f32(float %123)
%125 = fpext float %114 to double
%126 = fmul double %125, 2.000000e+00
%127 = fcmp ogt float %124, %122
%128 = select i1 %127, float %122, float %124
%129 = fpext float %128 to double
%130 = fcmp olt double %126, %129
br i1 %130, label %131, label %134
131: ; preds = %105
%132 = fdiv float %114, %113
%133 = tail call float @llvm.fabs.f32(float %132)
br label %134
134: ; preds = %64, %67, %105, %131
%135 = phi float [ %60, %64 ], [ %60, %67 ], [ %60, %105 ], [ %133, %131 ]
%136 = phi float [ %59, %64 ], [ %59, %67 ], [ %59, %105 ], [ %40, %131 ]
%137 = phi float [ %59, %64 ], [ %59, %67 ], [ %59, %105 ], [ %132, %131 ]
%138 = fcmp ogt float %135, %57
br i1 %138, label %144, label %139
139: ; preds = %134
%140 = fcmp ult float %59, 0.000000e+00
%141 = tail call float @llvm.fabs.f32(float %57)
br i1 %140, label %142, label %144
142: ; preds = %139
%143 = fneg float %141
br label %144
144: ; preds = %139, %142, %134
%145 = phi float [ %137, %134 ], [ %143, %142 ], [ %141, %139 ]
%146 = fadd float %52, %145
%147 = tail call float %0(float %146)
%148 = add nuw nsw i32 %20, 1
%149 = icmp eq i32 %148, 101
br i1 %149, label %150, label %19
150: ; preds = %144
%151 = tail call i32 @nrerror(i8* getelementptr inbounds ([48 x i8], [48 x i8]* @.str.1, i64 0, i64 0))
br label %152
152: ; preds = %47, %150
%153 = phi float [ 0.000000e+00, %150 ], [ %52, %47 ]
ret float %153
}