user: Demonstrate the C code that generates the assembly output below:

```asm
<frac>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  movsd  %xmm0,-0x38(%rbp)
  mov    %rdi,-0x40(%rbp)
  mov    %rsi,-0x48(%rbp)
  movsd  %xmm1,-0x50(%rbp)
  movsd  D13(%rip),%xmm0
  comisd -0x38(%rbp),%xmm0
  ja     L12
  movsd  -0x38(%rbp),%xmm0
  comisd D87(%rip),%xmm0
  ja     L12
  pxor   %xmm0,%xmm0
  comisd -0x50(%rbp),%xmm0
  jbe    L174
L12:
  movsd  D0(%rip),%xmm0
  jmp    L121
L174:
  movl   $0x1,-0x24(%rbp)
  mov    -0x48(%rbp),%rax
  mov    -0x24(%rbp),%edx
  mov    %edx,(%rax)
  movsd  -0x38(%rbp),%xmm0
  cvttsd2si %xmm0,%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  add    $0x1,%eax
  mov    %eax,-0x20(%rbp)
  jmp    L104
L182:
  nop
  movsd  -0x10(%rbp),%xmm0
  movsd  D58(%rip),%xmm1
  comisd %xmm1,%xmm0
  ja     L29
  movsd  D58(%rip),%xmm0
  divsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  jmp    L102
L29:
  nop
L102:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%edx
  movsd  -0x10(%rbp),%xmm0
  cvttsd2si %xmm0,%eax
  imul   %edx,%eax
  add    %eax,-0x20(%rbp)
  mov    -0x48(%rbp),%rax
  mov    (%rax),%edx
  movsd  -0x10(%rbp),%xmm0
  cvttsd2si %xmm0,%eax
  imul   %edx,%eax
  add    %eax,-0x24(%rbp)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%eax
  add    %eax,%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x48(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,(%rax)
L104:
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  -0x38(%rbp),%xmm0
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L142
  ucomisd %xmm1,%xmm0
  je     L167
L142:
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x20(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x24(%rbp),%xmm1
  mulsd  -0x38(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  mulsd  -0x38(%rbp),%xmm1
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  subsd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  movsd  D58(%rip),%xmm1
  comisd %xmm1,%xmm0
  ja     L147
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x1c(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x48(%rbp),%rax
  mov    -0x1c(%rbp),%edx
  mov    %edx,(%rax)
  jmp    L58
L167:
  nop
  jmp    L58
L147:
  nop
L58:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movapd %xmm1,%xmm2
  mulsd  -0x38(%rbp),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D58(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movq   D84(%rip),%xmm1
  andpd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x50(%rbp),%xmm0
  comisd -0x18(%rbp),%xmm0
  jae    L68
  movsd  D58(%rip),%xmm0
  movsd  %xmm0,-0x8(%rbp)
L24:
  movsd  -0x8(%rbp),%xmm1
  movsd  D27(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x18(%rbp),%xmm1
  movsd  D58(%rip),%xmm0
  comisd %xmm1,%xmm0
  ja     L24
  movsd  D58(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x8(%rbp),%xmm1
  movsd  -0x8(%rbp),%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x18(%rbp),%xmm2
  movsd  D80(%rip),%xmm0
  addsd  %xmm2,%xmm0
  cvttsd2si %xmm0,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  jmp    L161
L68:
  nop
L161:
  movsd  -0x50(%rbp),%xmm0
  comisd -0x18(%rbp),%xmm0
  jb     L7
  movsd  -0x18(%rbp),%xmm0
  jmp    L121
L7:
  pxor   %xmm0,%xmm0
  ucomisd -0x10(%rbp),%xmm0
  jp     L182
  pxor   %xmm0,%xmm0
  ucomisd -0x10(%rbp),%xmm0
  je     L44
  jmp    L182
L44:
  jmp    L112
L121:
  movq   %xmm0,%rax
L112:
  movq   %rax,%xmm0
  pop    %rbp
  ret
```

tool_calls: name: parse_data
arguments: label: D13
type_guessed: byte[8]
name: parse_data
arguments: label: D87
type_guessed: byte[16]
name: parse_data
arguments: label: D0
type_guessed: f32[2]
name: parse_data
arguments: label: D58
type_guessed: f64
name: parse_data
arguments: label: D84
type_guessed: qword
name: parse_data
arguments: label: D27
type_guessed: f64
name: parse_data
arguments: label: D80
type_guessed: f64

tool: {"D13": [0x4c,0xce,0x61,0xe3,0xa7,0x9d,0xf4,0x3d]}

tool: {"D87": [0x00,0x00,0x00,0x20,0x5f,0xa0,0x22,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

tool: {"D0": [0.0,-1.875]}

tool: D58: 1

tool: D84: 9223372036854775807

tool: D27: 10

tool: D80: 0.5

assistant: ```c
double frac(v, n, d, error)
double v, error;
int *n, *d;
{
  int D, N, t;
  double epsilon, r, m, fabs();
  if (v < 3.0e-10 || v > 4.0e+10 || error < 0.0)
    return (-1.0);
  *d = D = 1;
  *n = (int)v;
  N = (*n) + 1;
  goto three;
one:
  if (r > 1.0)
    goto two;
  r = 1.0 / r;
two:
  N += (*n) * (int)r;
  D += (*d) * (int)r;
  (*n) += N;
  (*d) += D;
three:
  r = 0.0;
  if (v * (*d) == (double)(*n))
    goto four;
  r = (N - v * D) / (v * (*d) - (*n));
  if (r > 1.0)
    goto four;
  t = N;
  N = (*n);
  *n = t;
  t = D;
  D = (*d);
  *d = t;
four:
  epsilon = fabs(1.0 - (*n) / (v * (*d)));
  if (epsilon <= error)
    goto six;
  m = 1.0;
  do {
    m *= 10.0;
  } while (m * epsilon < 1.0);
  epsilon = 1.0 / m * ((int)(0.5 + m * epsilon));
six:
  if (epsilon <= error)
    return (epsilon);
  if (r != 0.0)
    goto one;
}
```