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

```asm
<G_admin_duration>:
  endbr64
  mov    %rsi,%r8
  mov    %edx,%esi
  cmp    $0x5dfc0f00,%edi
  ja     L55
  cmp    $0x1e1337f,%edi
  jg     L12
  cmp    $0x76a6ff,%edi
  jg     L54
  cmp    $0x1517f,%edi
  jg     L7
  cmp    $0xe0f,%edi
  jg     L1
  cmp    $0x3b,%edi
  jle    L41
  pxor   %xmm0,%xmm0
  lea    D51(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D17(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   (%rax)
L12:
  pxor   %xmm0,%xmm0
  lea    D53(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D79(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L55:
  lea    D0(%rip),%rsi
  mov    %r8,%rdi
  jmp    1060 <Q_strncpyz@plt>
  nop
L1:
  pxor   %xmm0,%xmm0
  lea    D62(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D81(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L54:
  pxor   %xmm0,%xmm0
  lea    D70(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D84(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L7:
  pxor   %xmm0,%xmm0
  lea    D95(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D9(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L41:
  mov    %edi,%ecx
  lea    D75(%rip),%rdx
  mov    %r8,%rdi
  jmp    1070 <Com_sprintf@plt>
```

tool_calls: name: extract_symbolic_data
arguments: label: D51
type_guessed: string
name: extract_symbolic_data
arguments: label: D17
type_guessed: byte[4]
name: extract_symbolic_data
arguments: label: D53
type_guessed: string
name: extract_symbolic_data
arguments: label: D79
type_guessed: byte[4]
name: extract_symbolic_data
arguments: label: D0
type_guessed: string
name: extract_symbolic_data
arguments: label: D62
type_guessed: string
name: extract_symbolic_data
arguments: label: D81
type_guessed: byte[4]
name: extract_symbolic_data
arguments: label: D70
type_guessed: string
name: extract_symbolic_data
arguments: label: D84
type_guessed: byte[4]
name: extract_symbolic_data
arguments: label: D95
type_guessed: string
name: extract_symbolic_data
arguments: label: D9
type_guessed: byte[4]
name: extract_symbolic_data
arguments: label: D75
type_guessed: string

tool: D51: %1.1f minutes

tool: {"D17": [0x00,0x00,0x70,0x42]}

tool: D53: %1.1f years

tool: {"D79": [0xc0,0x99,0xf0,0x4b]}

tool: D0: PERMANENT

tool: D62: %1.1f hours

tool: {"D81": [0x00,0x00,0x61,0x45]}

tool: D70: %1.1f weeks

tool: {"D84": [0x00,0xa8,0x13,0x49]}

tool: D95: %1.1f days

tool: {"D9": [0x00,0xc0,0xa8,0x47]}

tool: D75: %i seconds

assistant: ```c
void G_admin_duration(int secs, char *duration, int dursize) {
  if (secs > (60 * 60 * 24 * 365 * 50) || secs < 0) {
    Q_strncpyz(duration, "PERMANENT", dursize);
  } else if (secs >= (60 * 60 * 24 * 365))
    Com_sprintf(duration, dursize, "%1.1f years", (secs / (60 * 60 * 24 * 365.0f)));
  else if (secs >= (60 * 60 * 24 * 90))
    Com_sprintf(duration, dursize, "%1.1f weeks", (secs / (60 * 60 * 24 * 7.0f)));
  else if (secs >= (60 * 60 * 24))
    Com_sprintf(duration, dursize, "%1.1f days", (secs / (60 * 60 * 24.0f)));
  else if (secs >= (60 * 60))
    Com_sprintf(duration, dursize, "%1.1f hours", (secs / (60 * 60.0f)));
  else if (secs >= 60)
    Com_sprintf(duration, dursize, "%1.1f minutes", (secs / 60.0f));
  else {
    Com_sprintf(duration, dursize, "%i seconds", secs);
  }
}
```