user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<fit_parabola_3p>:
  endbr64
  comisd %xmm0,%xmm4
  mov    %rdx,%r8
  movapd %xmm2,%xmm7
  ja     L0
  movq   %xmm1,%rax
  movapd %xmm5,%xmm1
  movq   %rax,%xmm5
  movq   %xmm0,%rax
  movapd %xmm4,%xmm0
  movq   %rax,%xmm4
L0:
  comisd %xmm7,%xmm0
  ja     L28
  comisd %xmm4,%xmm7
  movq   %xmm3,%rax
  movapd %xmm1,%xmm3
  jbe    L6
  movapd %xmm5,%xmm1
  movq   %rax,%xmm5
  movq   %xmm7,%rax
  movapd %xmm0,%xmm7
  movapd %xmm4,%xmm0
  movq   %rax,%xmm4
L28:
  ucomisd %xmm0,%xmm7
  mov    $0x0,%r9d
  setnp  %al
  cmovne %r9d,%eax
  ucomisd %xmm4,%xmm0
  setnp  %dl
  cmovne %r9d,%edx
  or     %dl,%al
  jne    L66
  ucomisd %xmm4,%xmm7
  setnp  %dl
  cmove  %edx,%eax
  test   %al,%al
  jne    L66
  movapd %xmm0,%xmm9
  movapd %xmm1,%xmm10
  subsd  %xmm1,%xmm5
  movsd  D12(%rip),%xmm6
  addsd  %xmm4,%xmm9
  subsd  %xmm3,%xmm10
  movapd %xmm0,%xmm2
  subsd  %xmm0,%xmm4
  subsd  %xmm7,%xmm2
  movapd %xmm7,%xmm8
  addsd  %xmm0,%xmm8
  mulsd  %xmm6,%xmm9
  movapd %xmm10,%xmm3
  divsd  %xmm4,%xmm5
  mulsd  %xmm6,%xmm8
  divsd  %xmm2,%xmm3
  movapd %xmm5,%xmm4
  subsd  %xmm3,%xmm4
  ucomisd D14(%rip),%xmm4
  mulsd  %xmm4,%xmm6
  movapd %xmm6,%xmm2
  movapd %xmm9,%xmm6
  subsd  %xmm8,%xmm6
  divsd  %xmm6,%xmm2
  movsd  %xmm2,(%rsi)
  jp     L51
  jne    L51
  movq   $0x0,(%r8)
L73:
  xor    %eax,%eax
  movsd  %xmm1,(%rcx)
  mov    %eax,(%rdi)
  ret
  nopw   0x0(%rax,%rax,1)
L66:
  mov    $0xffffffff,%eax
  mov    %eax,(%rdi)
  ret
L6:
  movq   %rax,%xmm1
  movq   %xmm7,%rax
  movapd %xmm0,%xmm7
  movq   %rax,%xmm0
  jmp    L28
  nopl   0x0(%rax,%rax,1)
L51:
  mulsd  %xmm3,%xmm9
  movapd %xmm8,%xmm2
  mulsd  %xmm5,%xmm2
  subsd  %xmm9,%xmm2
  divsd  %xmm4,%xmm2
  subsd  %xmm2,%xmm0
  movsd  %xmm2,(%r8)
  movsd  (%rsi),%xmm2
  mulsd  %xmm0,%xmm2
  mulsd  %xmm2,%xmm0
  subsd  %xmm0,%xmm1
  jmp    L73
```

tool_calls: name: read_data
arguments: tag: D12
type: f64
name: read_data
arguments: tag: D14
type: f64

tool: D12: 0.5

tool: D14: 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;
}
```