user: 下面的汇编指令对应的C源代码是什么:

```asm
<ffr4fi4>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  movsd  %xmm0,-0x28(%rbp)
  movsd  %xmm1,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  movsd  D37(%rip),%xmm0
  ucomisd -0x28(%rbp),%xmm0
  jp     L163
  movsd  D37(%rip),%xmm0
  ucomisd -0x28(%rbp),%xmm0
  jne    L163
  pxor   %xmm0,%xmm0
  ucomisd -0x30(%rbp),%xmm0
  jp     L163
  pxor   %xmm0,%xmm0
  ucomisd -0x30(%rbp),%xmm0
  jne    L163
  movq   $0x0,-0x10(%rbp)
  jmp    L42
L16:
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm0,%xmm1
  movsd  D8(%rip),%xmm0
  comisd %xmm1,%xmm0
  jbe    L180
  mov    -0x40(%rbp),%rax
  movl   $0xfffffff5,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movl   $0x80000000,(%rax)
  jmp    L57
L180:
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  cvtss2sd %xmm0,%xmm0
  comisd D48(%rip),%xmm0
  jbe    L10
  mov    -0x40(%rbp),%rax
  movl   $0xfffffff5,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movl   $0x7fffffff,(%rax)
  jmp    L57
L10:
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  cvttss2si %xmm0,%eax
  mov    %eax,(%rdx)
L57:
  addq   $0x1,-0x10(%rbp)
L42:
  mov    -0x10(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jl     L16
  jmp    L63
L163:
  movq   $0x0,-0x10(%rbp)
  jmp    L140
L160:
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  cvtss2sd %xmm0,%xmm0
  subsd  -0x30(%rbp),%xmm0
  divsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  D8(%rip),%xmm0
  comisd -0x8(%rbp),%xmm0
  jbe    L65
  mov    -0x40(%rbp),%rax
  movl   $0xfffffff5,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movl   $0x80000000,(%rax)
  jmp    L20
L65:
  movsd  -0x8(%rbp),%xmm0
  comisd D48(%rip),%xmm0
  jbe    L48
  mov    -0x40(%rbp),%rax
  movl   $0xfffffff5,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movl   $0x7fffffff,(%rax)
  jmp    L20
L48:
  movsd  -0x8(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L154
  movsd  -0x8(%rbp),%xmm1
  movsd  D64(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  cvttsd2si %xmm0,%eax
  mov    %eax,(%rdx)
  jmp    L20
L154:
  movsd  -0x8(%rbp),%xmm0
  movsd  D64(%rip),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  cvttsd2si %xmm0,%eax
  mov    %eax,(%rdx)
L20:
  addq   $0x1,-0x10(%rbp)
L140:
  mov    -0x10(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jl     L160
L63:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  pop    %rbp
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D37
type_infered: f64
name: extract_symbolic_data
arguments: label: D8
type_infered: byte[8]
name: extract_symbolic_data
arguments: label: D48
type_infered: f64[2]
name: extract_symbolic_data
arguments: label: D64
type_infered: f32[2]

tool: D37: 1

tool: {"D8": [0x14,0xae,0x0f,0x00,0x00,0x00,0xe0,0xc1]}

tool: {"D48": [2147483647.49,0.5]}

tool: {"D64": [0.0,1.75]}

assistant: ```c
int ffr4fi4(float *input, long ntodo, double scale, double zero, int *output, int *status) {
  long ii;
  double dvalue;
  if (scale == 1. && zero == 0.) {
    for (ii = 0; ii < ntodo; ii++) {
      if (input[ii] < -2147483648.49) {
        *status = -11;
        output[ii] = (-2147483647 - 1);
      } else if (input[ii] > 2147483647.49) {
        *status = -11;
        output[ii] = 2147483647;
      } else
        output[ii] = (int)input[ii];
    }
  } else {
    for (ii = 0; ii < ntodo; ii++) {
      dvalue = (input[ii] - zero) / scale;
      if (dvalue < -2147483648.49) {
        *status = -11;
        output[ii] = (-2147483647 - 1);
      } else if (dvalue > 2147483647.49) {
        *status = -11;
        output[ii] = 2147483647;
      } else {
        if (dvalue >= 0)
          output[ii] = (int)(dvalue + .5);
        else
          output[ii] = (int)(dvalue - .5);
      }
    }
  }
  return (*status);
}
```