user: What would the C source look like for the assembly code provided here?

```asm
<paw_bisection>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  movsd  %xmm0,-0x40(%rbp)
  movsd  %xmm1,-0x48(%rbp)
  movsd  %xmm2,-0x50(%rbp)
  movl   $0x0,-0x2c(%rbp)
  mov    -0x48(%rbp),%rax
  mov    -0x38(%rbp),%rdx
  movq   %rax,%xmm0
  call   *%rdx
  movq   %xmm0,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x38(%rbp),%rdx
  movq   %rax,%xmm0
  call   *%rdx
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L96
  lea    D35(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x63,%edi
  call   <exit@plt>
L96:
  pxor   %xmm0,%xmm0
  comisd -0x10(%rbp),%xmm0
  jbe    L94
  movsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x48(%rbp),%xmm0
  subsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  jmp    L87
L94:
  movsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x40(%rbp),%xmm0
  subsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,-0x28(%rbp)
L87:
  movl   $0x0,-0x30(%rbp)
  jmp    L47
L21:
  movsd  -0x28(%rbp),%xmm1
  movsd  D31(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  -0x20(%rbp),%xmm0
  addsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    -0x38(%rbp),%rdx
  movq   %rax,%xmm0
  call   *%rdx
  movq   %xmm0,%rax
  mov    %rax,-0x18(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x18(%rbp),%xmm0
  jb     L14
  movsd  -0x8(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
L14:
  movsd  -0x28(%rbp),%xmm0
  movq   D27(%rip),%xmm1
  andpd  %xmm0,%xmm1
  movsd  -0x50(%rbp),%xmm0
  comisd %xmm1,%xmm0
  ja     L102
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jp     L104
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jne    L104
L102:
  movl   $0x1,-0x2c(%rbp)
  jmp    L2
L104:
  addl   $0x1,-0x30(%rbp)
L47:
  cmpl   $0x18f,-0x30(%rbp)
  jle    L21
L2:
  cmpl   $0x0,-0x2c(%rbp)
  jne    L15
  lea    D16(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L15:
  movsd  -0x20(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D35
type_guessed: string
name: unpack_data
arguments: data_tag: D31
type_guessed: f64
name: unpack_data
arguments: data_tag: D27
type_guessed: qword
name: unpack_data
arguments: data_tag: D16
type_guessed: string

tool: D35:  paw_bisection.c : root must be bracketed

tool: D31: 0.5

tool: D27: 9223372036854775807

tool: D16: unable to find root within alotted number of iterations

assistant: ```c
double paw_bisection(double (*my_func)(double), double x1, double x2, double eps) {
  int j;
  int root_found;
  double dx, f, fmid, xmid, root;
  root_found = 0;
  fmid = my_func(x2);
  f = my_func(x1);
  if (f * fmid >= 0.0) {
    printf(" paw_bisection.c : root must be bracketed");
    exit(99);
  }
  if (f < 0.0) {
    root = x1;
    dx = x2 - x1;
  } else {
    root = x2;
    dx = x1 - x2;
  }
  for (j = 0; j < 400; ++j) {
    dx = 0.5 * dx;
    xmid = root + dx;
    fmid = my_func(xmid);
    if (fmid <= 0.0)
      root = xmid;
    if (fabs(dx) < eps || fmid == 0.0) {
      root_found = 1;
      break;
    }
  }
  if (!(root_found)) {
    printf("unable to find root within alotted number of iterations");
    exit(1);
  }
  return root;
}
```