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

```asm
<v_infnanzero>:
  endbr64
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  xor    %ebx,%ebx
  sub    $0x10,%rsp
  movsd  %xmm0,(%rsp)
  call   <is_zero@plt>
  mov    %rax,%r8
  xor    %eax,%eax
  test   %r8,%r8
  jne    L9
  movsd  (%rsp),%xmm2
  ucomisd %xmm2,%xmm2
  jp     L19
L44:
  movsd  D54(%rip),%xmm0
  divsd  D20(%rip),%xmm0
  ucomisd %xmm2,%xmm0
  jp     L129
  jne    L129
  movl   $0x0,0x4(%rbp)
  movapd %xmm2,%xmm0
  mov    $0x3,%esi
  mov    %rbp,%rdi
  call   <v_preformat@plt>
  lea    D30(%rip),%rdi
  add    %eax,%ebx
  call   <ft_putstr@plt>
  add    %eax,%ebx
L83:
  movsd  (%rsp),%xmm0
  mov    $0x3,%esi
  mov    %rbp,%rdi
  call   <v_postformat@plt>
  add    %ebx,%eax
L15:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L129:
  movapd %xmm0,%xmm1
  xorpd  D56(%rip),%xmm1
  ucomisd (%rsp),%xmm1
  jp     L15
  jne    L15
  movl   $0x0,0x4(%rbp)
  movsd  (%rsp),%xmm0
  mov    $0x3,%esi
  mov    %rbp,%rdi
  movsd  %xmm1,0x8(%rsp)
  call   <v_preformat@plt>
  movsd  0x8(%rsp),%xmm1
  add    %eax,%ebx
  ucomisd (%rsp),%xmm1
  jp     L83
  jne    L83
  lea    D30(%rip),%rdi
  call   <ft_putstr@plt>
  add    %eax,%ebx
  jmp    L83
  nopl   (%rax)
L9:
  mov    0x4(%rbp),%esi
  movsd  (%rsp),%xmm0
  mov    %rbp,%rdi
  test   %esi,%esi
  cmovs  %eax,%esi
  mov    %esi,0x4(%rbp)
  add    $0x6,%esi
  call   <v_preformat@plt>
  mov    $0x30,%edi
  mov    %rax,%rbx
  call   <ft_putchar@plt>
  mov    0x4(%rbp),%ecx
  add    %eax,%ebx
  test   %ecx,%ecx
  jne    L111
  mov    0x8(%rbp),%edx
  test   %edx,%edx
  je     L43
L111:
  mov    $0x2e,%edi
  call   <ft_putchar@plt>
  add    %eax,%ebx
  mov    0x4(%rbp),%eax
  test   %eax,%eax
  jle    L43
  xor    %r12d,%r12d
  xchg   %ax,%ax
L127:
  mov    $0x30,%edi
  add    $0x1,%r12d
  call   <ft_putchar@plt>
  add    %eax,%ebx
  cmp    %r12d,0x4(%rbp)
  jg     L127
L43:
  lea    D21(%rip),%rdi
  call   <ft_putstr@plt>
  movsd  (%rsp),%xmm0
  mov    %rbp,%rdi
  add    %eax,%ebx
  mov    0x4(%rbp),%eax
  lea    0x6(%rax),%esi
  call   <v_postformat@plt>
  movsd  (%rsp),%xmm2
  add    %eax,%ebx
  ucomisd %xmm2,%xmm2
  mov    %ebx,%eax
  jnp    L44
L19:
  movl   $0x0,0x4(%rbp)
  movapd %xmm2,%xmm0
  mov    $0x3,%esi
  mov    %rbp,%rdi
  call   <v_preformat@plt>
  lea    D12(%rip),%rdi
  mov    %rax,%r12
  call   <ft_putstr@plt>
  add    %r12d,%eax
  add    %eax,%ebx
  jmp    L83
```

tool_calls: name: retrieve_data
arguments: label: D54
type_infered: f64
name: retrieve_data
arguments: label: D20
type_infered: f64
name: retrieve_data
arguments: label: D30
type_infered: string
name: retrieve_data
arguments: label: D56
type_infered: byte[16]
name: retrieve_data
arguments: label: D21
type_infered: string
name: retrieve_data
arguments: label: D12
type_infered: string

tool: D54: 1

tool: D20: 0

tool: D30: inf

tool: {"D56": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: D21: p+0

tool: D12: nan

assistant: ```c
int v_infnanzero(double n, int fl[8]) {
  int ret;
  int index;
  ret = 0;
  if (is_zero(n) && (fl[1] = (fl[1] < 0) ? 0 : fl[1]) >= 0) {
    ret += v_preformat(n, fl, 6 + fl[1]);
    ret += ft_putchar('0');
    ret += (fl[1] || fl[2]) ? ft_putchar('.') : 0;
    index = -1;
    while (++index < fl[1])
      ret += ft_putchar('0');
    ret += ft_putstr("p+0");
    ret += v_postformat(n, fl, 6 + fl[1]);
  }
  if ((n != n || (n == 1.0 / 0.0) || (n == -1.0 / 0.0)) && !(fl[1] = 0)) {
    ret += v_preformat(n, fl, 3);
    if (n != n)
      ret += ft_putstr("nan");
    else if (n == 1.0 / 0.0 || n == -1.0 / 0.0)
      ret += ft_putstr("inf");
    ret += v_postformat(n, fl, 3);
  }
  return (ret);
}
```