user: What would the C source look like for the assembly code provided here?

```asm
<foo>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  movsd  %xmm0,-0x8(%rbp)
  movsd  %xmm1,-0x10(%rbp)
  movsd  %xmm2,-0x18(%rbp)
  movsd  %xmm3,-0x20(%rbp)
  movsd  %xmm4,-0x28(%rbp)
  movsd  %xmm5,-0x30(%rbp)
  movsd  %xmm6,-0x38(%rbp)
  movsd  %xmm7,-0x40(%rbp)
  mov    %rdi,-0x48(%rbp)
  pxor   %xmm0,%xmm0
  ucomisd -0x8(%rbp),%xmm0
  jp     L40
  pxor   %xmm0,%xmm0
  ucomisd -0x8(%rbp),%xmm0
  jne    L40
  movsd  D222(%rip),%xmm0
  ucomisd -0x10(%rbp),%xmm0
  jp     L40
  movsd  D222(%rip),%xmm0
  ucomisd -0x10(%rbp),%xmm0
  jne    L40
  movsd  -0x18(%rbp),%xmm0
  ucomisd D111(%rip),%xmm0
  jp     L40
  movsd  -0x18(%rbp),%xmm0
  ucomisd D111(%rip),%xmm0
  jne    L40
  movsd  -0x20(%rbp),%xmm0
  ucomisd D221(%rip),%xmm0
  jp     L40
  movsd  -0x20(%rbp),%xmm0
  ucomisd D221(%rip),%xmm0
  je     L5
L40:
  mov    $0x0,%eax
  call   <abort@plt>
L5:
  movsd  -0x28(%rbp),%xmm0
  ucomisd D71(%rip),%xmm0
  jp     L99
  movsd  -0x28(%rbp),%xmm0
  ucomisd D71(%rip),%xmm0
  jne    L99
  movsd  -0x30(%rbp),%xmm0
  ucomisd D180(%rip),%xmm0
  jp     L99
  movsd  -0x30(%rbp),%xmm0
  ucomisd D180(%rip),%xmm0
  jne    L99
  movsd  -0x38(%rbp),%xmm0
  ucomisd D237(%rip),%xmm0
  jp     L99
  movsd  -0x38(%rbp),%xmm0
  ucomisd D237(%rip),%xmm0
  jne    L99
  movsd  -0x40(%rbp),%xmm0
  ucomisd D148(%rip),%xmm0
  jp     L99
  movsd  -0x40(%rbp),%xmm0
  ucomisd D148(%rip),%xmm0
  je     L240
L99:
  mov    $0x0,%eax
  call   <abort@plt>
L240:
  movss  0x10(%rbp),%xmm0
  ucomiss D158(%rip),%xmm0
  jp     L160
  movss  0x10(%rbp),%xmm0
  ucomiss D158(%rip),%xmm0
  jne    L160
  movss  0x18(%rbp),%xmm0
  ucomiss D139(%rip),%xmm0
  jp     L160
  movss  0x18(%rbp),%xmm0
  ucomiss D139(%rip),%xmm0
  jne    L160
  movss  0x20(%rbp),%xmm0
  ucomiss D210(%rip),%xmm0
  jp     L160
  movss  0x20(%rbp),%xmm0
  ucomiss D210(%rip),%xmm0
  jne    L160
  movss  0x28(%rbp),%xmm0
  ucomiss D220(%rip),%xmm0
  jp     L160
  movss  0x28(%rbp),%xmm0
  ucomiss D220(%rip),%xmm0
  je     L0
L160:
  mov    $0x0,%eax
  call   <abort@plt>
L0:
  mov    -0x48(%rbp),%rax
  mov    $0x4,%edx
  lea    D87(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <__builtin_memcmp@plt>
  test   %rax,%rax
  je     L57
  mov    $0x0,%eax
  call   <abort@plt>
L57:
  mov    -0x48(%rbp),%rax
  mov    $0x4,%edx
  lea    D177(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <__builtin_memcpy@plt>
  nop
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D222
type: byte[8]
name: parse_data
arguments: data_tag: D111
type: byte[8]
name: parse_data
arguments: data_tag: D221
type: byte[8]
name: parse_data
arguments: data_tag: D71
type: byte[8]
name: parse_data
arguments: data_tag: D180
type: byte[8]
name: parse_data
arguments: data_tag: D237
type: byte[8]
name: parse_data
arguments: data_tag: D148
type: byte[8]
name: parse_data
arguments: data_tag: D158
type: byte[4]
name: parse_data
arguments: data_tag: D139
type: byte[4]
name: parse_data
arguments: data_tag: D210
type: byte[4]
name: parse_data
arguments: data_tag: D220
type: byte[4]
name: parse_data
arguments: data_tag: D87
type: string
name: parse_data
arguments: data_tag: D177
type: string

tool: {"D222": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: {"D111": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

tool: {"D221": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

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

tool: {"D180": [0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40]}

tool: {"D237": [0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x40]}

tool: {"D148": [0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x40]}

tool: {"D158": [0x00,0x00,0x20,0x41]}

tool: {"D139": [0x00,0x00,0x30,0x41]}

tool: {"D210": [0x00,0x00,0x40,0x41]}

tool: {"D220": [0x00,0x00,0x50,0x41]}

tool: D87: foo

tool: D177: bar

assistant: ```c
__attribute__((no)) void foo(double d0, double d1, double d2, double d3, double d4, double d5, double d6, double d7, float f0, float f1, float f2, float f3, char *p) {
  if (d0 != 0 || d1 != 1 || d2 != 2 || d3 != 3)
    abort();
  if (d4 != 4 || d5 != 5 || d6 != 6 || d7 != 7)
    abort();
  if (f0 != 10 || f1 != 11 || f2 != 12 || f3 != 13)
    abort();
  if (__builtin_memcmp(p, "foo", 4) != 0)
    abort();
  __builtin_memcpy(p, "bar", 4);
}
```