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

```asm
<fit_parabola_3p>:
  endbr64
  mov    %rdx,%r8
  movapd %xmm2,%xmm6
  comisd %xmm0,%xmm4
  ja     L43
  movq   %xmm1,%rax
  movapd %xmm5,%xmm1
  movq   %rax,%xmm5
  movq   %xmm0,%rax
  movapd %xmm4,%xmm0
  movq   %rax,%xmm4
L43:
  comisd %xmm6,%xmm0
  ja     L32
  comisd %xmm4,%xmm6
  jbe    L64
  movq   %xmm3,%rax
  movapd %xmm1,%xmm3
  movapd %xmm5,%xmm1
  movq   %rax,%xmm5
  movq   %xmm6,%rax
  movapd %xmm0,%xmm6
  movapd %xmm4,%xmm0
  movq   %rax,%xmm4
L32:
  ucomisd %xmm0,%xmm6
  setnp  %al
  mov    $0x0,%r9d
  cmovne %r9d,%eax
  ucomisd %xmm4,%xmm0
  setnp  %dl
  cmovne %r9d,%edx
  or     %dl,%al
  jne    L51
  ucomisd %xmm4,%xmm6
  setnp  %al
  mov    $0x0,%edx
  cmovne %edx,%eax
  test   %al,%al
  jne    L51
  movapd %xmm6,%xmm8
  addsd  %xmm0,%xmm8
  movsd  D0(%rip),%xmm7
  mulsd  %xmm7,%xmm8
  movapd %xmm0,%xmm9
  addsd  %xmm4,%xmm9
  mulsd  %xmm7,%xmm9
  movapd %xmm1,%xmm10
  subsd  %xmm3,%xmm10
  movapd %xmm0,%xmm2
  subsd  %xmm6,%xmm2
  movapd %xmm10,%xmm3
  divsd  %xmm2,%xmm3
  subsd  %xmm1,%xmm5
  subsd  %xmm0,%xmm4
  divsd  %xmm4,%xmm5
  movapd %xmm5,%xmm4
  subsd  %xmm3,%xmm4
  mulsd  %xmm4,%xmm7
  movapd %xmm7,%xmm2
  movapd %xmm9,%xmm6
  subsd  %xmm8,%xmm6
  divsd  %xmm6,%xmm2
  movsd  %xmm2,(%rsi)
  ucomisd D1(%rip),%xmm4
  jp     L20
  jne    L20
  movq   $0x0,(%r8)
L29:
  movsd  %xmm1,(%rcx)
  mov    $0x0,%eax
  jmp    L60
L64:
  movq   %xmm3,%rax
  movapd %xmm1,%xmm3
  movq   %rax,%xmm1
  movq   %xmm6,%rax
  movapd %xmm0,%xmm6
  movq   %rax,%xmm0
  jmp    L32
L20:
  movapd %xmm8,%xmm2
  mulsd  %xmm5,%xmm2
  mulsd  %xmm3,%xmm9
  subsd  %xmm9,%xmm2
  divsd  %xmm4,%xmm2
  movsd  %xmm2,(%r8)
  subsd  %xmm2,%xmm0
  movapd %xmm0,%xmm2
  mulsd  (%rsi),%xmm2
  mulsd  %xmm2,%xmm0
  subsd  %xmm0,%xmm1
  jmp    L29
L51:
  mov    $0xffffffff,%eax
L60:
  mov    %eax,(%rdi)
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D0
type: f64
name: disassemble_data
arguments: data_label: D1
type: f64

tool: D0: 0.5

tool: D1: 0

assistant: ```c
void fit_parabola_3p(int *pcode, double *pa, double *px0, double *pb, double x1, double y1, double x2, double y2, double x3, double y3) {
  double x12, x23, dy12, dy23, ddy, diff;
  if (!(x1 < x3)) {
    {
      double _tmp;
      _tmp = (x1);
      (x1) = (x3);
      (x3) = _tmp;
    };
    {
      double _tmp;
      _tmp = (y1);
      (y1) = (y3);
      (y3) = _tmp;
    };
  }
  if (x2 < x1) {
    {
      double _tmp;
      _tmp = (x1);
      (x1) = (x2);
      (x2) = _tmp;
    };
    {
      double _tmp;
      _tmp = (y1);
      (y1) = (y2);
      (y2) = _tmp;
    };
  } else if (x3 < x2) {
    {
      double _tmp;
      _tmp = (x2);
      (x2) = (x3);
      (x3) = _tmp;
    };
    {
      double _tmp;
      _tmp = (y2);
      (y2) = (y3);
      (y3) = _tmp;
    };
  }
  if ((x1 == x2) || (x2 == x3) || (x1 == x3)) {
    *pcode = (-1);
    return;
  }
  x12 = 0.5 * (x1 + x2);
  x23 = 0.5 * (x2 + x3);
  dy12 = (y2 - y1) / (x2 - x1);
  dy23 = (y3 - y2) / (x3 - x2);
  ddy = dy23 - dy12;
  *pa = 0.5 * ddy / (x23 - x12);
  if (ddy == 0.0) {
    *px0 = 0.0;
    *pb = y2;
  } else {
    *px0 = (dy23 * x12 - dy12 * x23) / ddy;
    diff = x2 - (*px0);
    *pb = y2 - (*pa) * diff * diff;
  }
  *pcode = 0;
}
```