user: 请将以下的汇编代码转换成C语言代码:

```asm
<pretty_freespace>:
  endbr64
  push   %r14
  lea    D37(%rip),%rcx
  mov    %rdi,%r14
  push   %r13
  movq   %rcx,%xmm0
  lea    D121(%rip),%rcx
  mov    %rdx,%r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  lea    D85(%rip),%rsi
  push   %rbx
  sub    $0x60,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  lea    D76(%rip),%rax
  movq   $0x0,0x50(%rsp)
  movq   %rax,%xmm4
  lea    D4(%rip),%rax
  punpcklqdq %xmm4,%xmm0
  movq   %rax,%xmm5
  lea    D135(%rip),%rax
  movaps %xmm0,0x10(%rsp)
  movq   %rcx,%xmm0
  movq   %rax,%xmm6
  lea    D32(%rip),%rcx
  punpcklqdq %xmm5,%xmm0
  lea    D84(%rip),%rax
  movaps %xmm0,0x20(%rsp)
  movq   %rsi,%xmm0
  movq   %rax,%xmm7
  mov    0x0(%rbp),%rax
  punpcklqdq %xmm6,%xmm0
  movaps %xmm0,0x30(%rsp)
  movq   %rcx,%xmm0
  punpcklqdq %xmm7,%xmm0
  movaps %xmm0,0x40(%rsp)
  test   %rax,%rax
  js     L52
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
L60:
  mov    0x0(%r13),%rax
  test   %rax,%rax
  js     L63
  pxor   %xmm1,%xmm1
  cvtsi2sd %rax,%xmm1
L78:
  mov    $0x400,%edi
  movsd  %xmm1,0x8(%rsp)
  movsd  %xmm0,(%rsp)
  call   <malloc@plt>
  movsd  0x8(%rsp),%xmm1
  movsd  (%rsp),%xmm0
  ucomisd D71(%rip),%xmm1
  mov    %rax,%r12
  jp     L55
  je     L0
L55:
  movsd  D72(%rip),%xmm3
  movsd  D26(%rip),%xmm2
  lea    0x10(%rsp),%rbx
  comisd %xmm3,%xmm1
  jbe    L24
  xchg   %ax,%ax
L93:
  mulsd  %xmm2,%xmm1
  add    $0x8,%rbx
  mulsd  %xmm2,%xmm0
  comisd %xmm3,%xmm1
  jbe    L24
  cmpq   $0x0,0x8(%rbx)
  jne    L93
L24:
  xor    %eax,%eax
  movsd  %xmm1,0x8(%rsp)
  movsd  %xmm0,(%rsp)
  call   <sysinfo_get_percent@plt>
  movsd  (%rsp),%xmm0
  movsd  0x8(%rsp),%xmm1
  test   %eax,%eax
  jne    L56
  mov    (%rbx),%r8
  mov    %r14,%rcx
  lea    D16(%rip),%rdx
  mov    %r12,%rdi
  mov    $0x400,%esi
  mov    $0x2,%eax
  mov    %r8,%r9
  call   <snprintf@plt>
L2:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L23
  add    $0x60,%rsp
  mov    %r12,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L56:
  mov    %r13,%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  movsd  %xmm1,(%rsp)
  call   <percentage@plt>
  movsd  (%rsp),%xmm1
  mov    (%rbx),%r8
  mov    %r14,%rcx
  mov    %eax,%r9d
  mov    $0x400,%esi
  mov    %r12,%rdi
  mov    $0x1,%eax
  movapd %xmm1,%xmm0
  lea    D21(%rip),%rdx
  call   <snprintf@plt>
  jmp    L2
  nop
L63:
  mov    %rax,%rdx
  and    $0x1,%eax
  pxor   %xmm1,%xmm1
  shr    %rdx
  or     %rax,%rdx
  cvtsi2sd %rdx,%xmm1
  addsd  %xmm1,%xmm1
  jmp    L78
  xchg   %ax,%ax
L52:
  mov    %rax,%rdx
  and    $0x1,%eax
  pxor   %xmm0,%xmm0
  shr    %rdx
  or     %rax,%rdx
  cvtsi2sd %rdx,%xmm0
  addsd  %xmm0,%xmm0
  jmp    L60
  xchg   %ax,%ax
L0:
  mov    %rax,%rdi
  mov    %r14,%rcx
  mov    $0x400,%esi
  xor    %eax,%eax
  lea    D114(%rip),%rdx
  call   <snprintf@plt>
  jmp    L2
L23:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_label: D37
type_guessed: string
name: disassemble_data
arguments: data_label: D121
type_guessed: string
name: disassemble_data
arguments: data_label: D85
type_guessed: string
name: disassemble_data
arguments: data_label: D76
type_guessed: string
name: disassemble_data
arguments: data_label: D4
type_guessed: string
name: disassemble_data
arguments: data_label: D135
type_guessed: string
name: disassemble_data
arguments: data_label: D32
type_guessed: string
name: disassemble_data
arguments: data_label: D84
type_guessed: string
name: disassemble_data
arguments: data_label: D71
type_guessed: byte[8]
name: disassemble_data
arguments: data_label: D72
type_guessed: byte[8]
name: disassemble_data
arguments: data_label: D26
type_guessed: byte[8]
name: disassemble_data
arguments: data_label: D16
type_guessed: string
name: disassemble_data
arguments: data_label: D21
type_guessed: string
name: disassemble_data
arguments: data_label: D114
type_guessed: string

tool: D37: KiB

tool: D121: GiB

tool: D85: PiB

tool: D76: MiB

tool: D4: TiB

tool: D135: EiB

tool: D32: ZiB

tool: D84: YiB

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

tool: {"D72": [0x00,0x00,0x00,0x00,0x00,0xf8,0x8f,0x40]}

tool: {"D26": [0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x3f]}

tool: D16: %s: %.1f%s/%.1f%s free

tool: D21: %s: %.1f%s, %.1f%% free

tool: D114: %s: none

assistant: ```c
char *pretty_freespace(const char *desc, unsigned long long *free_k, unsigned long long *total_k) {
  char *quantities[] = {"KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", 0};
  char *result, **quantity;
  double free_space, total_space;
  free_space = *free_k;
  total_space = *total_k;
  result = malloc(1024 * sizeof(char));
  if (total_space == 0) {
    snprintf(result, 1024, "%s: none", desc);
    return result;
  }
  quantity = quantities;
  while (total_space > 1023 && *(quantity + 1)) {
    quantity++;
    free_space = free_space / 1024;
    total_space = total_space / 1024;
  }
  if (sysinfo_get_percent() != 0)
    snprintf(result, 1024, "%s: %.1f%s, %.1f%% free", desc, total_space, *quantity, percentage(free_k, total_k));
  else
    snprintf(result, 1024, "%s: %.1f%s/%.1f%s free", desc, free_space, *quantity, total_space, *quantity);
  return result;
}
```