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

```asm
<parse_timespec>:
  endbr64
  push   %r12
  push   %rbp
  sub    $0x28,%rsp
  movsd  D52(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  test   %rdi,%rdi
  je     L110
  mov    %rsp,%r12
  lea    D121(%rip),%rsi
  mov    %rdi,%rbp
  mov    %r12,%rdx
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L139
  mov    %r12,%rdx
  lea    D150(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L180
  mov    %r12,%rdx
  lea    D81(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L104
  mov    %r12,%rdx
  lea    D116(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L107
  mov    %r12,%rdx
  lea    D151(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L144
  mov    %r12,%rdx
  lea    D171(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L148
  mov    %r12,%rdx
  lea    D34(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L87
  mov    %r12,%rdx
  lea    D128(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L7
  mov    %r12,%rdx
  lea    D83(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L52
  mov    %rbp,%rdi
  call   <parse_npt@plt>
  nopw   0x0(%rax,%rax,1)
L110:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L145
  add    $0x28,%rsp
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax)
L180:
  movsd  D16(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
  nopw   0x0(%rax,%rax,1)
L139:
  mov    %r12,%rdi
  call   <parse_npt@plt>
  jmp    L110
  nopw   0x0(%rax,%rax,1)
L104:
  movsd  D66(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
  nopw   0x0(%rax,%rax,1)
L107:
  movsd  D23(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
  nopw   0x0(%rax,%rax,1)
L144:
  movsd  D7(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
  nopl   (%rax)
L148:
  movsd  D39(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
  nopl   (%rax)
L87:
  movsd  D127(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
  nopl   (%rax)
L7:
  movsd  D43(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
  nopl   (%rax)
L52:
  movsd  D82(%rip),%xmm0
  mov    %r12,%rdi
  call   <parse_smpte@plt>
  jmp    L110
L145:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D52
data_type: byte[8]
name: parse_data
arguments: label: D121
data_type: string
name: parse_data
arguments: label: D150
data_type: string
name: parse_data
arguments: label: D81
data_type: string
name: parse_data
arguments: label: D116
data_type: string
name: parse_data
arguments: label: D151
data_type: string
name: parse_data
arguments: label: D171
data_type: string
name: parse_data
arguments: label: D34
data_type: string
name: parse_data
arguments: label: D128
data_type: string
name: parse_data
arguments: label: D83
data_type: string
name: parse_data
arguments: label: D16
data_type: f64
name: parse_data
arguments: label: D66
data_type: f64
name: parse_data
arguments: label: D23
data_type: f64
name: parse_data
arguments: label: D7
data_type: f64
name: parse_data
arguments: label: D39
data_type: f64
name: parse_data
arguments: label: D127
data_type: f64
name: parse_data
arguments: label: D43
data_type: byte[8]
name: parse_data
arguments: label: D82
data_type: f64

tool: {"D52": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

tool: D121: npt:%16s

tool: D150: smpte-24:%16s

tool: D81: smpte-24-drop:%16s

tool: D116: smpte-25:%16s

tool: D151: smpte-30:%16s

tool: D171: smpte-30-drop:%16s

tool: D34: smpte-50:%16s

tool: D128: smpte-60:%16s

tool: D83: smpte-60-drop:%16s

tool: D16: 24

tool: D66: 23.976

tool: D23: 25

tool: D7: 30

tool: D39: 29.97

tool: D127: 50

tool: {"D43": [0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x40]}

tool: D82: 59.94

assistant: ```c
double parse_timespec(const char *str) {
  char timespec[16];
  if (str == NULL)
    return -1.0;
  if (sscanf(str, "npt:%16s", timespec) == 1) {
    return parse_npt(timespec);
  }
  if (sscanf(str, "smpte-24:%16s", timespec) == 1) {
    return parse_smpte(timespec, 24.0);
  }
  if (sscanf(str, "smpte-24-drop:%16s", timespec) == 1) {
    return parse_smpte(timespec, 23.976);
  }
  if (sscanf(str, "smpte-25:%16s", timespec) == 1) {
    return parse_smpte(timespec, 25.0);
  }
  if (sscanf(str, "smpte-30:%16s", timespec) == 1) {
    return parse_smpte(timespec, 30.0);
  }
  if (sscanf(str, "smpte-30-drop:%16s", timespec) == 1) {
    return parse_smpte(timespec, 29.97);
  }
  if (sscanf(str, "smpte-50:%16s", timespec) == 1) {
    return parse_smpte(timespec, 50.0);
  }
  if (sscanf(str, "smpte-60:%16s", timespec) == 1) {
    return parse_smpte(timespec, 60);
  }
  if (sscanf(str, "smpte-60-drop:%16s", timespec) == 1) {
    return parse_smpte(timespec, 59.94);
  }
  return parse_npt(str);
}
```