user: 请从给定的汇编指令推导出C源代码：

```asm
<lib3ds_math_ease>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  movss  %xmm0,-0x24(%rbp)
  movss  %xmm1,-0x28(%rbp)
  movss  %xmm2,-0x2c(%rbp)
  movss  %xmm3,-0x30(%rbp)
  movss  %xmm4,-0x34(%rbp)
  movss  -0x28(%rbp),%xmm0
  subss  -0x24(%rbp),%xmm0
  movss  -0x2c(%rbp),%xmm1
  subss  -0x24(%rbp),%xmm1
  divss  %xmm1,%xmm0
  cvtss2sd %xmm0,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movss  -0x34(%rbp),%xmm0
  addss  -0x30(%rbp),%xmm0
  cvtss2sd %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  pxor   %xmm0,%xmm0
  ucomisd -0x10(%rbp),%xmm0
  jp     L31
  pxor   %xmm0,%xmm0
  ucomisd -0x10(%rbp),%xmm0
  je     L64
L31:
  movsd  -0x10(%rbp),%xmm0
  movsd  D48(%rip),%xmm1
  comisd %xmm1,%xmm0
  jbe    L62
  pxor   %xmm0,%xmm0
  cvtss2sd -0x34(%rbp),%xmm0
  divsd  -0x10(%rbp),%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x34(%rbp)
  pxor   %xmm0,%xmm0
  cvtss2sd -0x30(%rbp),%xmm0
  divsd  -0x10(%rbp),%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x30(%rbp)
L62:
  movss  -0x34(%rbp),%xmm0
  addss  -0x30(%rbp),%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm0,%xmm2
  movsd  D13(%rip),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D48(%rip),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  pxor   %xmm0,%xmm0
  cvtss2sd -0x30(%rbp),%xmm0
  comisd -0x18(%rbp),%xmm0
  jbe    L5
  pxor   %xmm1,%xmm1
  cvtss2sd -0x30(%rbp),%xmm1
  movsd  -0x8(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  mulsd  -0x18(%rbp),%xmm0
  movsd  -0x18(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  jmp    L64
L5:
  pxor   %xmm2,%xmm2
  cvtss2sd -0x34(%rbp),%xmm2
  movsd  D48(%rip),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  -0x18(%rbp),%xmm0
  comisd %xmm1,%xmm0
  jb     L49
  movsd  D48(%rip),%xmm0
  subsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  pxor   %xmm1,%xmm1
  cvtss2sd -0x34(%rbp),%xmm1
  movsd  -0x8(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  mulsd  -0x18(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x18(%rbp),%xmm1
  movsd  D48(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  jmp    L64
L49:
  movsd  -0x18(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd -0x30(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  movsd  -0x8(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
L64:
  pxor   %xmm0,%xmm0
  cvtsd2ss -0x20(%rbp),%xmm0
  pop    %rbp
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D48
type_infered: f64
name: retrieve_data
arguments: data_label: D13
type_infered: f64

tool: D48: 1

tool: D13: 2

assistant: ```c
float lib3ds_math_ease(float fp, float fc, float fn, float ease_from, float ease_to) {
  double s, step;
  double tofrom;
  double a;
  s = step = (float)(fc - fp) / (fn - fp);
  tofrom = ease_to + ease_from;
  if (tofrom != 0.0) {
    if (tofrom > 1.0) {
      ease_to = (float)(ease_to / tofrom);
      ease_from = (float)(ease_from / tofrom);
    }
    a = 1.0 / (2.0 - (ease_to + ease_from));
    if (step < ease_from)
      s = a / ease_from * step * step;
    else {
      if ((1.0 - ease_to) <= step) {
        step = 1.0 - step;
        s = 1.0 - a / ease_to * step * step;
      } else {
        s = ((2.0 * step) - ease_from) * a;
      }
    }
  }
  return ((float)s);
}
```