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

```asm
<size2str>:
  endbr64
  push   %rbx
  mov    %rsi,%rbx
  mov    %edx,%esi
  test   %rdi,%rdi
  js     L63
  pxor   %xmm0,%xmm0
  cvtsi2ss %rdi,%xmm0
L98:
  mulss  D159(%rip),%xmm0
  comiss D87(%rip),%xmm0
  jae    L84
  comiss D33(%rip),%xmm0
  jae    L47
  comiss D105(%rip),%xmm0
  jae    L96
  comiss D107(%rip),%xmm0
  jae    L31
  comiss D21(%rip),%xmm0
  jbe    L29
  cvtss2sd %xmm0,%xmm0
  lea    D93(%rip),%rdx
  mov    %rbx,%rdi
  mov    $0x1,%eax
  call   <snprintf@plt>
  jmp    L16
L63:
  mov    %rdi,%rax
  shr    %rax
  and    $0x1,%edi
  or     %rdi,%rax
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  addss  %xmm0,%xmm0
  jmp    L98
L84:
  mulss  D119(%rip),%xmm0
  cvtss2sd %xmm0,%xmm0
  lea    D1(%rip),%rdx
  mov    %rbx,%rdi
  mov    $0x1,%eax
  call   <snprintf@plt>
L16:
  mov    %rbx,%rax
  pop    %rbx
  ret
L47:
  mulss  D137(%rip),%xmm0
  cvtss2sd %xmm0,%xmm0
  lea    D78(%rip),%rdx
  mov    %rbx,%rdi
  mov    $0x1,%eax
  call   <snprintf@plt>
  jmp    L16
L96:
  mulss  D152(%rip),%xmm0
  cvtss2sd %xmm0,%xmm0
  lea    D96(%rip),%rdx
  mov    %rbx,%rdi
  mov    $0x1,%eax
  call   <snprintf@plt>
  jmp    L16
L31:
  mulss  D159(%rip),%xmm0
  cvtss2sd %xmm0,%xmm0
  lea    D91(%rip),%rdx
  mov    %rbx,%rdi
  mov    $0x1,%eax
  call   <snprintf@plt>
  jmp    L16
L29:
  lea    D134(%rip),%rdx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <snprintf@plt>
  jmp    L16
```

tool_calls: name: retrieve_data
arguments: data_tag: D159
type: byte[4]
name: retrieve_data
arguments: data_tag: D87
type: byte[4]
name: retrieve_data
arguments: data_tag: D33
type: byte[4]
name: retrieve_data
arguments: data_tag: D105
type: byte[4]
name: retrieve_data
arguments: data_tag: D107
type: byte[4]
name: retrieve_data
arguments: data_tag: D21
type: byte[4]
name: retrieve_data
arguments: data_tag: D93
type: string
name: retrieve_data
arguments: data_tag: D119
type: byte[4]
name: retrieve_data
arguments: data_tag: D1
type: string
name: retrieve_data
arguments: data_tag: D137
type: byte[4]
name: retrieve_data
arguments: data_tag: D78
type: string
name: retrieve_data
arguments: data_tag: D152
type: byte[4]
name: retrieve_data
arguments: data_tag: D96
type: string
name: retrieve_data
arguments: data_tag: D91
type: string
name: retrieve_data
arguments: data_tag: D134
type: string

tool: {"D159": [0x00,0x00,0x80,0x3a]}

tool: {"D87": [0x00,0x00,0x7a,0x53]}

tool: {"D33": [0x00,0x00,0x7a,0x4e]}

tool: {"D105": [0x00,0x00,0x7a,0x49]}

tool: {"D107": [0x00,0x00,0x7a,0x44]}

tool: {"D21": [0x00,0x00,0x00,0x00]}

tool: D93: %.1fK

tool: {"D119": [0x00,0x00,0x80,0x2b]}

tool: D1: %.1fP

tool: {"D137": [0x00,0x00,0x80,0x30]}

tool: D78: %.1fT

tool: {"D152": [0x00,0x00,0x80,0x35]}

tool: D96: %.1fG

tool: D91: %.1fM

tool: D134: -0-

assistant: ```c
char *size2str(unsigned long long size, char *str, int len) {
  float n = (float)size / 1024;
  if (n >= 1000ULL * 1024 * 1024 * 1024)
    snprintf(str, len, "%.1fP", n / (1024ULL * 1024 * 1024 * 1024));
  else if (n >= 1000 * 1024 * 1024)
    snprintf(str, len, "%.1fT", n / (1024 * 1024 * 1024));
  else if (n >= 1000 * 1024)
    snprintf(str, len, "%.1fG", n / (1024 * 1024));
  else if (n >= 1000)
    snprintf(str, len, "%.1fM", n / 1024);
  else if (n > 0)
    snprintf(str, len, "%.1fK", n);
  else
    snprintf(str, len, "-0-");
  return str;
}
```