user: Demonstrate the C code that generates the assembly output below:

```asm
<PrintFP>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  movapd %xmm0,%xmm7
  movsd  %xmm0,0x8(%rsp)
  mov    %rdi,%r12
  pxor   %xmm0,%xmm0
  comisd %xmm7,%xmm0
  ja     L64
L89:
  movsd  0x8(%rsp),%xmm4
  comisd D17(%rip),%xmm4
  jae    L58
  movsd  0x8(%rsp),%xmm7
  ucomisd D105(%rip),%xmm7
  setp   %al
  mov    $0x1,%edx
  cmovne %edx,%eax
  test   %al,%al
  je     L30
  movsd  D39(%rip),%xmm0
  comisd %xmm7,%xmm0
  jae    L166
L30:
  mov    $0x0,%r13d
L107:
  mov    %r13d,%edi
  mov    D77(%rip),%rax
  movq   %rax,%xmm0
  call   <pow@plt>
  movsd  0x8(%rsp),%xmm4
  divsd  %xmm0,%xmm4
  movsd  %xmm4,0x8(%rsp)
  cvttsd2si %xmm4,%rbx
  mov    %r12,%r8
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %ebx,%edi
  call   <PrintInt@plt>
  mov    %r12,%rsi
  mov    $0x2e,%edi
  call   <PrintCh@plt>
  pxor   %xmm1,%xmm1
  cvtsi2sd %rbx,%xmm1
  movsd  0x8(%rsp),%xmm0
  subsd  %xmm1,%xmm0
  mulsd  D77(%rip),%xmm0
  movapd %xmm0,%xmm5
  movsd  %xmm0,0x8(%rsp)
  pxor   %xmm0,%xmm0
  comisd %xmm5,%xmm0
  ja     L1
  mov    $0x6,%ebx
  movsd  0x8(%rsp),%xmm6
  comisd D39(%rip),%xmm6
  jae    L12
L142:
  mov    %r12,%rsi
  mov    $0x30,%edi
  call   <PrintCh@plt>
L167:
  test   %r13d,%r13d
  jne    L106
L121:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L64:
  mov    %rdi,%rsi
  mov    $0x2d,%edi
  call   <PrintCh@plt>
  movsd  0x8(%rsp),%xmm3
  xorpd  D99(%rip),%xmm3
  movsd  %xmm3,0x8(%rsp)
  jmp    L89
L58:
  movapd %xmm4,%xmm0
  call   <log10@plt>
  cvttsd2si %xmm0,%r13d
  jmp    L107
L166:
  movapd %xmm7,%xmm0
  call   <log10@plt>
  subsd  D11(%rip),%xmm0
  cvttsd2si %xmm0,%r13d
  jmp    L107
L1:
  mov    $0x6,%ebx
  movsd  D30(%rip),%xmm0
  comisd %xmm5,%xmm0
  jae    L12
  jmp    L142
L24:
  movsd  D30(%rip),%xmm6
  comisd %xmm2,%xmm6
  jb     L167
L172:
  movsd  0x8(%rsp),%xmm0
  addsd  D39(%rip),%xmm0
  cvttsd2si %xmm0,%rbp
  lea    0x30(%rbp),%edi
  movsbl %dil,%edi
  mov    %r12,%rsi
  call   <PrintCh@plt>
  pxor   %xmm1,%xmm1
  cvtsi2sd %rbp,%xmm1
  movsd  0x8(%rsp),%xmm0
  subsd  %xmm1,%xmm0
  mulsd  D77(%rip),%xmm0
  movsd  %xmm0,0x8(%rsp)
  sub    $0x1,%ebx
  je     L167
L12:
  pxor   %xmm3,%xmm3
  movsd  0x8(%rsp),%xmm2
  comisd %xmm2,%xmm3
  ja     L24
  movsd  0x8(%rsp),%xmm6
  comisd D39(%rip),%xmm6
  jae    L172
  jmp    L167
L106:
  mov    %r12,%rsi
  mov    $0x65,%edi
  call   <PrintCh@plt>
  mov    %r12,%r8
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %r13d,%edi
  call   <PrintInt@plt>
  jmp    L121
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D17
type: f64[2]
name: extract_symbolic_data
arguments: data_label: D105
type: f64
name: extract_symbolic_data
arguments: data_label: D39
type: byte[16]
name: extract_symbolic_data
arguments: data_label: D77
type: f64
name: extract_symbolic_data
arguments: data_label: D99
type: byte[16]
name: extract_symbolic_data
arguments: data_label: D11
type: f64
name: extract_symbolic_data
arguments: data_label: D30
type: byte[8]

tool: {"D17": [10000000.0,1e-7]}

tool: D105: 0

tool: {"D39": [0x48,0xaf,0xbc,0x9a,0xf2,0xd7,0x7a,0x3e,0xa1,0x8f,0x76,0xff,0xff,0xff,0xef,0x3f]}

tool: D77: 10

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

tool: D11: 0.999999999

tool: {"D30": [0x48,0xaf,0xbc,0x9a,0xf2,0xd7,0x7a,0xbe]}

assistant: ```c
void PrintFP(double Num, struct OutputStream *Stream) {
  int Exponent = 0;
  int MaxDecimal;
  if (Num < 0) {
    PrintCh('-', Stream);
    Num = -Num;
  }
  if (Num >= 1e7)
    Exponent = log10(Num);
  else if (Num <= 1e-7 && Num != 0.0)
    Exponent = log10(Num) - 0.999999999;
  Num /= pow(10.0, Exponent);
  PrintInt((long)Num, 0, 0, 0, Stream);
  PrintCh('.', Stream);
  Num = (Num - (long)Num) * 10;
  if ((((Num) < 0) ? (-(Num)) : (Num)) >= 1e-7) {
    for (MaxDecimal = 6; MaxDecimal > 0 && (((Num) < 0) ? (-(Num)) : (Num)) >= 1e-7; Num = (Num - (long)(Num + 1e-7)) * 10, MaxDecimal--)
      PrintCh('0' + (long)(Num + 1e-7), Stream);
  } else
    PrintCh('0', Stream);
  if (Exponent != 0) {
    PrintCh('e', Stream);
    PrintInt(Exponent, 0, 0, 0, Stream);
  }
}
```