user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<poly1305_mac>:
  endbr64
  push   %r15
  pxor   %xmm1,%xmm1
  push   %r14
  push   %r13
  mov    %rcx,%r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x118,%rsp
  movzbl 0x7(%r13),%edx
  movzbl 0x3(%rcx),%ecx
  movzbl 0x6(%r13),%r10d
  mov    %rdi,0x18(%rsp)
  lea    0x70(%rsp),%r14
  lea    0xc0(%rsp),%r12
  and    $0xf,%edx
  movzbl 0x4(%r13),%r9d
  movzbl 0xc(%r13),%r8d
  and    $0xf,%ecx
  shl    $0x8,%rdx
  movzbl 0xb(%r13),%edi
  movzbl 0x8(%r13),%esi
  lea    0x20(%rsp),%r15
  mov    %fs:0x28,%rax
  mov    %rax,0x108(%rsp)
  xor    %eax,%eax
  or     %r10,%rdx
  movzbl 0x5(%r13),%r10d
  movzbl 0xf(%r13),%eax
  shl    $0x8,%rdx
  and    $0xfc,%r9d
  and    $0xfc,%r8d
  and    $0xf,%edi
  or     %r10,%rdx
  and    $0xf,%eax
  shl    $0x8,%rdx
  shl    $0x8,%rax
  or     %r9,%rdx
  movzbl 0xe(%r13),%r9d
  shl    $0x8,%rdx
  or     %r9,%rax
  movzbl 0xd(%r13),%r9d
  or     %rcx,%rdx
  movzbl 0x2(%r13),%ecx
  shl    $0x8,%rax
  shl    $0x8,%rdx
  or     %r9,%rax
  or     %rcx,%rdx
  movzbl 0x1(%r13),%ecx
  shl    $0x8,%rax
  shl    $0x8,%rdx
  or     %r8,%rax
  or     %rcx,%rdx
  movzbl 0x0(%r13),%ecx
  shl    $0x8,%rax
  shl    $0x8,%rdx
  or     %rdi,%rax
  movzbl 0xa(%r13),%edi
  shl    $0x8,%rax
  or     %rdi,%rax
  movzbl 0x9(%r13),%edi
  shl    $0x8,%rax
  or     %rdi,%rax
  and    $0xfc,%esi
  or     %rcx,%rdx
  shl    $0x8,%rax
  mov    %rdx,(%rsp)
  or     %rsi,%rax
  mov    %rax,0x8(%rsp)
  movdqa (%rsp),%xmm2
  movdqa (%rsp),%xmm0
  punpcklbw %xmm1,%xmm2
  punpckhbw %xmm1,%xmm0
  movdqa %xmm2,%xmm3
  pxor   %xmm1,%xmm1
  punpckhwd %xmm1,%xmm2
  punpcklwd %xmm1,%xmm3
  movaps %xmm3,0x20(%rsp)
  movaps %xmm2,0x30(%rsp)
  movdqa %xmm0,%xmm2
  punpckhwd %xmm1,%xmm0
  punpcklwd %xmm1,%xmm2
  movaps %xmm0,0x50(%rsp)
  pxor   %xmm0,%xmm0
  movl   $0x0,0x60(%rsp)
  movl   $0x0,0xb0(%rsp)
  movaps %xmm2,0x40(%rsp)
  movaps %xmm0,0x70(%rsp)
  movaps %xmm0,0x80(%rsp)
  movaps %xmm0,0x90(%rsp)
  movaps %xmm0,0xa0(%rsp)
  test   %rbx,%rbx
  jne    L110
  jmp    L0
  nopw   0x0(%rax,%rax,1)
L106:
  movzbl 0x1(%rbp),%eax
  mov    %eax,0xc4(%rsp)
  cmp    $0x2,%rbx
  je     L292
  movzbl 0x2(%rbp),%eax
  mov    %eax,0xc8(%rsp)
  cmp    $0x3,%rbx
  je     L25
  movzbl 0x3(%rbp),%eax
  mov    %eax,0xcc(%rsp)
  cmp    $0x4,%rbx
  je     L220
  movzbl 0x4(%rbp),%eax
  mov    %eax,0xd0(%rsp)
  cmp    $0x5,%rbx
  je     L38
  movzbl 0x5(%rbp),%eax
  mov    %eax,0xd4(%rsp)
  cmp    $0x6,%rbx
  je     L79
  movzbl 0x6(%rbp),%eax
  mov    %eax,0xd8(%rsp)
  cmp    $0x7,%rbx
  je     L202
  movzbl 0x7(%rbp),%eax
  mov    %eax,0xdc(%rsp)
  cmp    $0x8,%rbx
  je     L253
  movzbl 0x8(%rbp),%eax
  mov    %eax,0xe0(%rsp)
  cmp    $0x9,%rbx
  je     L14
  movzbl 0x9(%rbp),%eax
  mov    %eax,0xe4(%rsp)
  cmp    $0xa,%rbx
  je     L158
  movzbl 0xa(%rbp),%eax
  mov    %eax,0xe8(%rsp)
  cmp    $0xb,%rbx
  je     L115
  movzbl 0xb(%rbp),%eax
  mov    %eax,0xec(%rsp)
  cmp    $0xc,%rbx
  je     L321
  movzbl 0xc(%rbp),%eax
  mov    %eax,0xf0(%rsp)
  cmp    $0xd,%rbx
  je     L58
  movzbl 0xd(%rbp),%eax
  mov    %eax,0xf4(%rsp)
  cmp    $0xe,%rbx
  je     L231
  movzbl 0xe(%rbp),%eax
  mov    %eax,0xf8(%rsp)
  cmp    $0xf,%rbx
  je     L297
  movzbl 0xf(%rbp),%eax
  mov    %r12,%rsi
  mov    %r14,%rdi
  sub    $0x10,%rbx
  movl   $0x1,0x100(%rsp)
  add    $0x10,%rbp
  mov    %eax,0xfc(%rsp)
  call   <add@plt>
  mov    %r15,%rsi
  mov    %r14,%rdi
  call   <mulmod@plt>
  test   %rbx,%rbx
  je     L0
L110:
  movzbl 0x0(%rbp),%eax
  pxor   %xmm0,%xmm0
  movl   $0x0,0x40(%r12)
  movaps %xmm0,(%r12)
  movaps %xmm0,0x10(%r12)
  mov    %eax,0xc0(%rsp)
  movaps %xmm0,0x20(%r12)
  movaps %xmm0,0x30(%r12)
  cmp    $0x1,%rbx
  jne    L106
  mov    $0x1,%eax
  nopl   (%rax)
L192:
  mov    %r12,%rsi
  mov    %r14,%rdi
  movl   $0x1,0xc0(%rsp,%rax,4)
  call   <add@plt>
  mov    %r15,%rsi
  mov    %r14,%rdi
  call   <mulmod@plt>
L0:
  mov    %r14,%rdi
  call   <freeze@plt>
  pxor   %xmm1,%xmm1
  mov    %r12,%rsi
  mov    %r14,%rdi
  movdqu 0x10(%r13),%xmm0
  movl   $0x0,0x100(%rsp)
  movdqa %xmm0,%xmm2
  punpckhbw %xmm1,%xmm0
  punpcklbw %xmm1,%xmm2
  pxor   %xmm1,%xmm1
  movdqa %xmm2,%xmm3
  punpckhwd %xmm1,%xmm2
  movaps %xmm2,0xd0(%rsp)
  movdqa %xmm0,%xmm2
  punpcklwd %xmm1,%xmm3
  punpckhwd %xmm1,%xmm0
  punpcklwd %xmm1,%xmm2
  movaps %xmm3,0xc0(%rsp)
  movaps %xmm2,0xe0(%rsp)
  movaps %xmm0,0xf0(%rsp)
  call   <add@plt>
  movdqa 0x70(%rsp),%xmm0
  mov    0x18(%rsp),%rax
  movdqa %xmm0,%xmm1
  punpcklwd 0x80(%rsp),%xmm0
  punpckhwd 0x80(%rsp),%xmm1
  movdqa %xmm0,%xmm2
  punpcklwd %xmm1,%xmm0
  punpckhwd %xmm1,%xmm2
  movdqa 0x90(%rsp),%xmm1
  punpcklwd %xmm2,%xmm0
  movdqa %xmm1,%xmm2
  punpcklwd 0xa0(%rsp),%xmm1
  punpckhwd 0xa0(%rsp),%xmm2
  movdqa %xmm1,%xmm3
  punpcklwd %xmm2,%xmm1
  punpckhwd %xmm2,%xmm3
  movdqa D3(%rip),%xmm2
  punpcklwd %xmm3,%xmm1
  pand   %xmm2,%xmm0
  pand   %xmm1,%xmm2
  packuswb %xmm2,%xmm0
  movups %xmm0,(%rax)
  mov    0x108(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L57
  add    $0x118,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L292:
  mov    $0x2,%eax
  jmp    L192
L25:
  mov    $0x3,%eax
  jmp    L192
L220:
  mov    $0x4,%eax
  jmp    L192
L38:
  mov    $0x5,%eax
  jmp    L192
L79:
  mov    $0x6,%eax
  jmp    L192
L202:
  mov    $0x7,%eax
  jmp    L192
L253:
  mov    $0x8,%eax
  jmp    L192
L14:
  mov    $0x9,%eax
  jmp    L192
L158:
  mov    $0xa,%eax
  jmp    L192
L115:
  mov    $0xb,%eax
  jmp    L192
L321:
  mov    $0xc,%eax
  jmp    L192
L58:
  mov    $0xd,%eax
  jmp    L192
L231:
  mov    $0xe,%eax
  jmp    L192
L297:
  mov    $0xf,%eax
  jmp    L192
L57:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: tag: D3
type_infered: byte[16]

tool: {"D3": [0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00]}

assistant: ```c
int poly1305_mac(unsigned char *out, const unsigned char *in, unsigned long long inlen, const unsigned char *k) {
  unsigned int j;
  unsigned int r[17];
  unsigned int h[17];
  unsigned int c[17];
  r[0] = k[0];
  r[1] = k[1];
  r[2] = k[2];
  r[3] = k[3] & 15;
  r[4] = k[4] & 252;
  r[5] = k[5];
  r[6] = k[6];
  r[7] = k[7] & 15;
  r[8] = k[8] & 252;
  r[9] = k[9];
  r[10] = k[10];
  r[11] = k[11] & 15;
  r[12] = k[12] & 252;
  r[13] = k[13];
  r[14] = k[14];
  r[15] = k[15] & 15;
  r[16] = 0;
  for (j = 0; j < 17; ++j)
    h[j] = 0;
  while (inlen > 0) {
    for (j = 0; j < 17; ++j)
      c[j] = 0;
    for (j = 0; (j < 16) && (j < inlen); ++j)
      c[j] = in[j];
    c[j] = 1;
    in += j;
    inlen -= j;
    add(h, c);
    mulmod(h, r);
  }
  freeze(h);
  for (j = 0; j < 16; ++j)
    c[j] = k[j + 16];
  c[16] = 0;
  add(h, c);
  for (j = 0; j < 16; ++j)
    out[j] = h[j];
  return 0;
}
```