user: Translate the below assembly code into C programming language:

```asm
<quad_roots>:
  endbr64
  push   %r14
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  movq   %xmm3,%rbp
  movq   %xmm4,%r12
  mov    %rdi,%rbx
  movq   D108(%rip),%xmm3
  movapd %xmm0,%xmm6
  andpd  %xmm3,%xmm6
  movapd %xmm1,%xmm5
  andpd  %xmm3,%xmm5
  andpd  %xmm2,%xmm3
  movapd %xmm5,%xmm4
  maxsd  %xmm3,%xmm4
  mulsd  D56(%rip),%xmm4
  comisd %xmm6,%xmm4
  ja     L195
  movsd  D93(%rip),%xmm4
  comisd %xmm6,%xmm4
  jbe    L173
L195:
  mulsd  D56(%rip),%xmm3
  mov    $0x0,%eax
  comisd %xmm5,%xmm3
  ja     L18
  xorpd  D71(%rip),%xmm2
  divsd  %xmm1,%xmm2
  movsd  %xmm2,(%rbx)
  movq   %rbp,%xmm7
  mov    $0x0,%eax
  comisd %xmm7,%xmm2
  jbe    L18
  movq   %r12,%xmm7
  comisd %xmm2,%xmm7
  seta   %al
  movzbl %al,%eax
L18:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r14
  ret
L173:
  movapd %xmm1,%xmm7
  divsd  %xmm0,%xmm7
  movq   %xmm7,%r14
  movapd %xmm2,%xmm6
  divsd  %xmm0,%xmm6
  movsd  %xmm6,0x8(%rsp)
  mulsd  D72(%rip),%xmm7
  movapd %xmm7,%xmm0
  subsd  %xmm6,%xmm0
  mov    $0x0,%eax
  pxor   %xmm1,%xmm1
  comisd %xmm0,%xmm1
  ja     L18
  ucomisd %xmm0,%xmm1
  ja     L55
  sqrtsd %xmm0,%xmm0
L77:
  movq   %r14,%xmm7
  comisd D9(%rip),%xmm7
  jbe    L78
  mulsd  D21(%rip),%xmm7
  movapd %xmm7,%xmm1
  subsd  %xmm0,%xmm1
L2:
  movsd  %xmm1,(%rbx)
  movapd %xmm1,%xmm0
  andpd  D108(%rip),%xmm0
  movsd  D56(%rip),%xmm2
  comisd %xmm0,%xmm2
  ja     L54
  movsd  0x8(%rsp),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rbx)
  movq   %rbp,%xmm7
  comisd %xmm1,%xmm7
  jae    L176
  movq   %r12,%xmm7
  comisd %xmm7,%xmm1
  jae    L176
  mov    $0x1,%eax
  movq   %rbp,%xmm7
  comisd %xmm0,%xmm7
  jae    L18
  movq   %r12,%xmm7
  comisd %xmm7,%xmm0
  jae    L18
  comisd %xmm0,%xmm1
  jbe    L70
  movsd  %xmm1,0x8(%rbx)
  movsd  %xmm0,(%rbx)
L70:
  movsd  (%rbx),%xmm0
  subsd  0x8(%rbx),%xmm0
  andpd  D108(%rip),%xmm0
  movsd  D56(%rip),%xmm1
  ucomisd %xmm0,%xmm1
  setbe  %al
  movzbl %al,%eax
  add    $0x1,%eax
  jmp    L18
L55:
  call   <sqrt@plt>
  jmp    L77
L78:
  movq   %r14,%xmm1
  mulsd  D21(%rip),%xmm1
  addsd  %xmm0,%xmm1
  jmp    L2
L54:
  movq   %rbp,%xmm7
  mov    $0x0,%eax
  comisd %xmm7,%xmm1
  jbe    L18
  movq   %r12,%xmm7
  comisd %xmm1,%xmm7
  seta   %al
  movzbl %al,%eax
  jmp    L18
L176:
  movsd  %xmm0,(%rbx)
  movq   %rbp,%xmm7
  mov    $0x0,%eax
  comisd %xmm7,%xmm0
  jbe    L18
  movq   %r12,%xmm7
  comisd %xmm0,%xmm7
  seta   %al
  movzbl %al,%eax
  jmp    L18
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D108
datatype: qword[2]
name: extract_symbolic_data
arguments: data_tag: D56
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D93
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D71
datatype: f32[4]
name: extract_symbolic_data
arguments: data_tag: D72
datatype: f64
name: extract_symbolic_data
arguments: data_tag: D9
datatype: f32[4]
name: extract_symbolic_data
arguments: data_tag: D21
datatype: f32[2]

tool: {"D108": [0x7fffffffffffffff,0x0000000000000000]}

tool: {"D56": [0x3a,0x8c,0x30,0xe2,0x8e,0x79,0x45,0x3e]}

tool: {"D93": [0xbc,0x89,0xd8,0x97,0xb2,0xd2,0x9c,0x3c]}

tool: {"D71": [0.0,-0.0,0.0,0.0]}

tool: D72: 0.25

tool: {"D9": [0.0,0.0,0.0,-0.0]}

tool: {"D21": [0.0,-1.75]}

assistant: ```c
int quad_roots(double a, double b, double c, double t0, double t1, double *t) {
  if (fabs(a) < (fabs(b) > fabs(c) ? fabs(b) : fabs(c)) * 1.0e-8 || fabs(a) < 1.0e-16) {
    if (fabs(b) < fabs(c) * 1.0e-8)
      return 0;
    t[0] = -c / b;
    return t[0] > t0 && t[0] < t1;
  }
  double p = b / a;
  double q = c / a;
  double det = 0.25 * p - q;
  if (det < 0)
    return 0;
  det = sqrt(det);
  if (p > 0.0)
    t[0] = -0.5 * p - det;
  else
    t[0] = -0.5 * p + det;
  if (fabs(t[0]) < 1.0e-8)
    return t[0] > t0 && t[0] < t1;
  t[1] = q / t[0];
  if (t[0] <= t0 || t[0] >= t1) {
    t[0] = t[1];
    return t[0] > t0 && t[0] < t1;
  }
  if (t[1] <= t0 || t[1] >= t1)
    return 1;
  if (t[0] > t[1]) {
    double tmp = t[1];
    t[1] = t[0];
    t[0] = tmp;
  }
  return fabs(t[0] - t[1]) < 1.0e-8 ? 1 : 2;
}
```