user: Please show me the C implementation that matches the assembly code listed below:

```asm
<dpoly_step>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  movsd  %xmm0,-0x38(%rbp)
  movsd  %xmm1,-0x40(%rbp)
  movsd  %xmm2,-0x48(%rbp)
  movsd  %xmm3,-0x50(%rbp)
  movsd  %xmm4,-0x58(%rbp)
  movsd  -0x40(%rbp),%xmm0
  comisd -0x38(%rbp),%xmm0
  jb     L14
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  jmp    L25
L14:
  movsd  -0x38(%rbp),%xmm0
  comisd -0x48(%rbp),%xmm0
  jb     L30
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  jmp    L25
L30:
  movsd  -0x38(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  movsd  -0x40(%rbp),%xmm1
  addsd  -0x48(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  movsd  -0x48(%rbp),%xmm1
  subsd  -0x40(%rbp),%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x48(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  -0x40(%rbp),%xmm1
  movsd  D74(%rip),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x20(%rbp),%xmm1
  movsd  D39(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D65(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  -0x20(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movsd  D15(%rip),%xmm2
  movapd %xmm0,%xmm3
  divsd  %xmm2,%xmm3
  movsd  D43(%rip),%xmm0
  movapd %xmm0,%xmm2
  subsd  %xmm3,%xmm2
  movsd  -0x20(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movsd  D40(%rip),%xmm3
  divsd  %xmm3,%xmm0
  addsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x20(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x20(%rbp),%xmm2
  movsd  D43(%rip),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  -0x20(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  addsd  %xmm0,%xmm1
  movsd  D84(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x18(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x58(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  -0x50(%rbp),%xmm1
  movsd  D51(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x8(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
L25:
  movsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  pop    %rbp
  ret
```

tool_calls: name: disassemble_data
arguments: label: D74
type_infered: f64
name: disassemble_data
arguments: label: D39
type_infered: f64
name: disassemble_data
arguments: label: D65
type_infered: f64
name: disassemble_data
arguments: label: D15
type_infered: f64
name: disassemble_data
arguments: label: D43
type_infered: f64
name: disassemble_data
arguments: label: D40
type_infered: f64
name: disassemble_data
arguments: label: D84
type_infered: f32[2]
name: disassemble_data
arguments: label: D51
type_infered: f64

tool: D74: 2

tool: D39: 15

tool: D65: 8

tool: D15: 3

tool: D43: 1

tool: D40: 5

tool: {"D84": [0.0,1.984375]}

tool: D51: 0.5

assistant: ```c
double dpoly_step(double x, double a, double b, double ya, double yb) {
  double dy;
  if (x <= a)
    dy = 0.0;
  else if (x >= b)
    dy = 0.0;
  else {
    double X = (2 * x - (a + b)) / (b - a);
    double dX = 2.0 / (b - a);
    double Y = 15.0 * X / 8.0 * (1.0 - 2.0 * X * X / 3.0 + X * X * X * X / 5.0);
    double dY = 15.0 / 8.0 * (1.0 - 2.0 * X * X + X * X * X * X) * dX;
    dy = 0.5 * (yb - ya) * dY;
  }
  return dy;
}
```