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

```asm
<in_chksum_udp6>:
  endbr64
  push   %rbx
  mov    %rsi,%r8
  movzwl (%rsi),%eax
  xor    %r11d,%r11d
  movzwl 0x2(%rsi),%esi
  movzwl 0x22(%rdi),%ecx
  add    %esi,%eax
  movzwl 0x4(%r8),%esi
  add    %esi,%eax
  movzwl 0x6(%r8),%esi
  add    %esi,%eax
  movzwl (%rdi),%esi
  add    %esi,%eax
  movzwl 0x2(%rdi),%esi
  add    %esi,%eax
  movzwl 0x4(%rdi),%esi
  add    %esi,%eax
  movzwl 0x6(%rdi),%esi
  add    %esi,%eax
  movzwl 0x8(%rdi),%esi
  add    %esi,%eax
  movzwl 0xa(%rdi),%esi
  add    %esi,%eax
  movzwl 0xc(%rdi),%esi
  add    %esi,%eax
  movzwl 0xe(%rdi),%esi
  add    %esi,%eax
  movzwl 0x10(%rdi),%esi
  add    %esi,%eax
  movzwl 0x12(%rdi),%esi
  add    %esi,%eax
  movzwl 0x14(%rdi),%esi
  add    %esi,%eax
  movzwl 0x16(%rdi),%esi
  add    %esi,%eax
  movzwl 0x18(%rdi),%esi
  add    %esi,%eax
  movzwl 0x1a(%rdi),%esi
  add    %esi,%eax
  movzwl 0x1c(%rdi),%esi
  add    %esi,%eax
  movzwl 0x1e(%rdi),%esi
  add    %esi,%eax
  movzwl 0x20(%rdi),%esi
  lea    0x8(%r8),%rdi
  add    %esi,%eax
  lea    -0x8(%rdx),%esi
  add    %eax,%ecx
  cmp    $0x1f,%esi
  jle    L32
  lea    -0x28(%rdx),%esi
  mov    %rdi,%rdx
  mov    %esi,%r10d
  shr    $0x5,%r10d
  mov    %r10d,%r9d
  mov    %r9,%rax
  shl    $0x5,%rax
  lea    0x28(%r8,%rax,1),%r8
  nopl   0x0(%rax)
L30:
  movzwl 0x2(%rdx),%ebx
  movzwl (%rdx),%eax
  add    $0x20,%rdx
  add    %ebx,%eax
  movzwl -0x1c(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x1a(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x18(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x16(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x14(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x12(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x10(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0xe(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0xc(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0xa(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x8(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x6(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x4(%rdx),%ebx
  add    %ebx,%eax
  movzwl -0x2(%rdx),%ebx
  add    %ebx,%eax
  add    %eax,%ecx
  cmp    %r8,%rdx
  jne    L30
  add    $0x1,%r9
  shl    $0x5,%r10d
  shl    $0x5,%r9
  sub    %r10d,%esi
  add    %r9,%rdi
L32:
  cmp    $0x7,%esi
  jle    L52
  mov    %rdi,%rdx
  lea    (%rsi,%rdi,1),%r8d
L58:
  movzwl 0x2(%rdx),%r9d
  movzwl (%rdx),%eax
  add    $0x8,%rdx
  add    %r9d,%eax
  movzwl -0x4(%rdx),%r9d
  add    %r9d,%eax
  movzwl -0x2(%rdx),%r9d
  add    %r9d,%eax
  add    %eax,%ecx
  mov    %r8d,%eax
  sub    %edx,%eax
  cmp    $0x7,%eax
  jg     L58
  sub    $0x8,%esi
  mov    %esi,%eax
  shr    $0x3,%eax
  lea    0x1(%rax),%edx
  neg    %eax
  lea    (%rdi,%rdx,8),%rdi
  lea    (%rsi,%rax,8),%esi
L52:
  cmp    $0x1,%esi
  jle    L55
  mov    %rdi,%rax
  lea    (%rsi,%rdi,1),%r8d
L31:
  movzwl (%rax),%edx
  add    $0x2,%rax
  add    %edx,%ecx
  mov    %r8d,%edx
  sub    %eax,%edx
  cmp    $0x1,%edx
  jg     L31
  sub    $0x2,%esi
  mov    %esi,%eax
  shr    %eax
  lea    0x1(%rax),%edx
  neg    %eax
  lea    (%rdi,%rdx,2),%rdi
  lea    (%rsi,%rax,2),%esi
L55:
  cmp    $0x1,%esi
  jne    L56
  mov    (%rdi),%r11b
  movzwl %r11w,%r11d
  add    %r11d,%ecx
L56:
  mov    %ecx,%edx
  movzwl %cx,%ecx
  pop    %rbx
  shr    $0x10,%edx
  add    %ecx,%edx
  mov    %edx,%eax
  shr    $0x10,%eax
  add    %edx,%eax
  not    %eax
  ret
```

assistant: ```c
unsigned short in_chksum_udp6(unsigned short *h, unsigned short *d, int dlen) {
  unsigned int cksum;
  unsigned short answer = 0;
  cksum = h[0];
  cksum += h[1];
  cksum += h[2];
  cksum += h[3];
  cksum += h[4];
  cksum += h[5];
  cksum += h[6];
  cksum += h[7];
  cksum += h[8];
  cksum += h[9];
  cksum += h[10];
  cksum += h[11];
  cksum += h[12];
  cksum += h[13];
  cksum += h[14];
  cksum += h[15];
  cksum += h[16];
  cksum += h[17];
  cksum += d[0];
  cksum += d[1];
  cksum += d[2];
  cksum += d[3];
  dlen -= 8;
  d += 4;
  while (dlen >= 32) {
    cksum += d[0];
    cksum += d[1];
    cksum += d[2];
    cksum += d[3];
    cksum += d[4];
    cksum += d[5];
    cksum += d[6];
    cksum += d[7];
    cksum += d[8];
    cksum += d[9];
    cksum += d[10];
    cksum += d[11];
    cksum += d[12];
    cksum += d[13];
    cksum += d[14];
    cksum += d[15];
    d += 16;
    dlen -= 32;
  }
  while (dlen >= 8) {
    cksum += d[0];
    cksum += d[1];
    cksum += d[2];
    cksum += d[3];
    d += 4;
    dlen -= 8;
  }
  while (dlen > 1) {
    cksum += *d++;
    dlen -= 2;
  }
  if (dlen == 1) {
    *(unsigned char *)(&answer) = (*(unsigned char *)d);
    cksum += answer;
  }
  cksum = (cksum >> 16) + (cksum & 0x0000ffff);
  cksum += (cksum >> 16);
  return (unsigned short)(~cksum);
}
```