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

```asm
<v_infnanzero>:
  endbr64
  push   %r12
  xor    %r12d,%r12d
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x10,%rsp
  movsd  %xmm0,(%rsp)
  call   <is_zero@plt>
  test   %rax,%rax
  jne    L122
  movsd  (%rsp),%xmm2
  ucomisd %xmm2,%xmm2
  jp     L18
L71:
  movsd  D17(%rip),%xmm0
  divsd  D21(%rip),%xmm0
  ucomisd %xmm2,%xmm0
  jp     L118
  jne    L118
  movl   $0x0,0x4(%rbp)
  movsd  (%rsp),%xmm0
  mov    $0x3,%esi
  mov    %rbp,%rdi
  call   <v_preformat@plt>
  lea    D64(%rip),%rdi
  add    %eax,%r12d
  call   <ft_putstr@plt>
  add    %eax,%r12d
L96:
  movsd  (%rsp),%xmm0
  mov    $0x3,%esi
  mov    %rbp,%rdi
  call   <v_postformat@plt>
  add    %eax,%r12d
L68:
  add    $0x10,%rsp
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L118:
  movapd %xmm0,%xmm1
  xorpd  D43(%rip),%xmm1
  ucomisd (%rsp),%xmm1
  jp     L68
  jne    L68
  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,%r12d
  ucomisd (%rsp),%xmm1
  jp     L96
  jne    L96
  lea    D64(%rip),%rdi
  call   <ft_putstr@plt>
  add    %eax,%r12d
  jmp    L96
  nopw   0x0(%rax,%rax,1)
L122:
  mov    0x4(%rbp),%esi
  xor    %eax,%eax
  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    L105
  mov    0x8(%rbp),%edx
  test   %edx,%edx
  je     L78
L105:
  mov    $0x2e,%edi
  call   <ft_putchar@plt>
  add    %eax,%ebx
  mov    0x4(%rbp),%eax
  test   %eax,%eax
  jle    L78
  xor    %r12d,%r12d
L17:
  mov    $0x30,%edi
  add    $0x1,%r12d
  call   <ft_putchar@plt>
  add    %eax,%ebx
  cmp    %r12d,0x4(%rbp)
  jg     L17
L78:
  lea    D24(%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
  lea    (%rbx,%rax,1),%r12d
  ucomisd %xmm2,%xmm2
  jnp    L71
L18:
  movl   $0x0,0x4(%rbp)
  movsd  (%rsp),%xmm0
  mov    $0x3,%esi
  mov    %rbp,%rdi
  call   <v_preformat@plt>
  lea    D50(%rip),%rdi
  mov    %rax,%rbx
  call   <ft_putstr@plt>
  add    %ebx,%eax
  add    %eax,%r12d
  jmp    L96
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D17
data_type: f64
name: extract_symbolic_data
arguments: data_tag: D21
data_type: f64
name: extract_symbolic_data
arguments: data_tag: D64
data_type: string
name: extract_symbolic_data
arguments: data_tag: D43
data_type: byte[16]
name: extract_symbolic_data
arguments: data_tag: D24
data_type: string
name: extract_symbolic_data
arguments: data_tag: D50
data_type: string

tool: D17: 1

tool: D21: 0

tool: D64: inf

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

tool: D24: p+0

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