user: 下面的汇编指令对应的C源代码是什么:

```asm
<adler32>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%r12
  mov    %edx,-0x8(%rsp)
  mov    %rdi,%rax
  shr    $0x10,%rax
  movzwl %ax,%eax
  mov    %rax,-0x18(%rsp)
  movzwl %di,%r15d
  cmp    $0x1,%edx
  je     L148
  test   %rsi,%rsi
  je     L21
  mov    -0x8(%rsp),%eax
  cmp    $0xf,%eax
  jbe    L167
  lea    0x15b0(%rsi),%rdi
  mov    %rdi,-0x10(%rsp)
  cmp    $0x15af,%eax
  jbe    L94
L111:
  mov    -0x10(%rsp),%rax
  lea    -0x15b0(%rax),%rcx
  mov    -0x8(%rsp),%eax
  mov    %eax,-0x4(%rsp)
  sub    $0x15b0,%eax
  mov    %eax,-0x8(%rsp)
L102:
  movzbl (%rcx),%eax
  add    %r15,%rax
  movzbl 0x1(%rcx),%r14d
  add    %rax,%r14
  movzbl 0x2(%rcx),%r13d
  add    %r14,%r13
  movzbl 0x3(%rcx),%r12d
  add    %r13,%r12
  movzbl 0x4(%rcx),%ebp
  add    %r12,%rbp
  movzbl 0x5(%rcx),%ebx
  add    %rbp,%rbx
  movzbl 0x6(%rcx),%r11d
  add    %rbx,%r11
  movzbl 0x7(%rcx),%edx
  lea    (%rdx,%r11,1),%rsi
  movzbl 0x8(%rcx),%edx
  mov    %rsi,-0x28(%rsp)
  add    %rsi,%rdx
  movzbl 0x9(%rcx),%r10d
  mov    %rdx,-0x20(%rsp)
  add    %rdx,%r10
  movzbl 0xa(%rcx),%r9d
  add    %r10,%r9
  movzbl 0xb(%rcx),%r8d
  add    %r9,%r8
  movzbl 0xc(%rcx),%edi
  add    %r8,%rdi
  movzbl 0xd(%rcx),%esi
  add    %rdi,%rsi
  movzbl 0xe(%rcx),%edx
  add    %rsi,%rdx
  movzbl 0xf(%rcx),%r15d
  add    %rdx,%r15
  add    %r14,%rax
  add    %r13,%rax
  add    %r12,%rax
  add    %rbp,%rax
  add    %rbx,%rax
  add    %r11,%rax
  add    -0x28(%rsp),%rax
  add    -0x20(%rsp),%rax
  add    %r10,%rax
  add    %r9,%rax
  add    %r8,%rax
  add    %rdi,%rax
  add    %rsi,%rax
  add    %rdx,%rax
  add    %r15,%rax
  add    %rax,-0x18(%rsp)
  add    $0x10,%rcx
  cmp    -0x10(%rsp),%rcx
  jne    L102
  movabs $0xf00e10d2fc5cd,%rax
  mul    %r15
  mov    %r15,%rax
  sub    %rdx,%rax
  shr    %rax
  add    %rax,%rdx
  shr    $0xf,%rdx
  imul   $0xfff1,%rdx,%rax
  sub    %rax,%r15
  movabs $0xf00e10d2fc5cd,%rax
  mov    -0x18(%rsp),%rdi
  mul    %rdi
  mov    %rdi,%rax
  sub    %rdx,%rax
  shr    %rax
  add    %rax,%rdx
  shr    $0xf,%rdx
  imul   $0xfff1,%rdx,%rax
  sub    %rax,%rdi
  mov    %rdi,-0x18(%rsp)
  addq   $0x15b0,-0x10(%rsp)
  cmpl   $0x15af,-0x8(%rsp)
  ja     L111
  mov    %rcx,%r12
  mov    -0x8(%rsp),%eax
  test   %eax,%eax
  jne    L25
L132:
  mov    -0x18(%rsp),%rax
  shl    $0x10,%rax
  or     %r15,%rax
L76:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L148:
  movzbl (%rsi),%edx
  add    %r15,%rdx
  lea    -0xfff1(%rdx),%rax
  cmp    $0xfff0,%rdx
  cmova  %rax,%rdx
  mov    -0x18(%rsp),%rax
  add    %rdx,%rax
  lea    -0xfff1(%rax),%rcx
  cmp    $0xfff0,%rax
  cmova  %rcx,%rax
  shl    $0x10,%rax
  or     %rdx,%rax
  jmp    L76
L167:
  mov    -0x8(%rsp),%edi
  lea    -0x1(%rdi),%eax
  test   %edi,%edi
  je     L68
  mov    %eax,%eax
  lea    0x1(%rsi,%rax,1),%rdx
  mov    -0x18(%rsp),%rax
L9:
  add    $0x1,%r12
  movzbl -0x1(%r12),%ecx
  add    %rcx,%r15
  add    %r15,%rax
  cmp    %r12,%rdx
  jne    L9
  mov    %rax,-0x18(%rsp)
L68:
  lea    -0xfff1(%r15),%rax
  cmp    $0xfff0,%r15
  cmova  %rax,%r15
  movabs $0xf00e10d2fc5cd,%rdx
  mov    -0x18(%rsp),%rax
  mul    %rdx
  mov    -0x18(%rsp),%rdi
  mov    %rdi,%rax
  sub    %rdx,%rax
  shr    %rax
  add    %rdx,%rax
  shr    $0xf,%rax
  imul   $0xfff1,%rax,%rax
  mov    %rdi,%rdx
  sub    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x10,%rax
  or     %r15,%rax
  jmp    L76
L25:
  cmp    $0xf,%eax
  jbe    L140
L94:
  mov    -0x8(%rsp),%eax
  sub    $0x10,%eax
  shr    $0x4,%eax
  mov    %eax,-0x4(%rsp)
  add    $0x1,%eax
  mov    %eax,%eax
  shl    $0x4,%rax
  lea    (%r12,%rax,1),%r14
L169:
  movzbl (%r12),%eax
  add    %r15,%rax
  movzbl 0x1(%r12),%r13d
  add    %rax,%r13
  movzbl 0x2(%r12),%ebp
  add    %r13,%rbp
  movzbl 0x3(%r12),%ebx
  add    %rbp,%rbx
  movzbl 0x4(%r12),%r11d
  add    %rbx,%r11
  movzbl 0x5(%r12),%r10d
  add    %r11,%r10
  movzbl 0x6(%r12),%r9d
  add    %r10,%r9
  movzbl 0x7(%r12),%r8d
  add    %r9,%r8
  movzbl 0x8(%r12),%edi
  add    %r8,%rdi
  movzbl 0x9(%r12),%esi
  add    %rdi,%rsi
  movzbl 0xa(%r12),%ecx
  add    %rsi,%rcx
  movzbl 0xb(%r12),%edx
  lea    (%rdx,%rcx,1),%r15
  movzbl 0xc(%r12),%edx
  mov    %r15,-0x28(%rsp)
  add    %r15,%rdx
  mov    %rdx,%r15
  movzbl 0xd(%r12),%edx
  mov    %r15,-0x20(%rsp)
  add    %r15,%rdx
  mov    %rdx,%r15
  movzbl 0xe(%r12),%edx
  mov    %r15,-0x10(%rsp)
  add    %r15,%rdx
  movzbl 0xf(%r12),%r15d
  add    %rdx,%r15
  add    %r13,%rax
  add    %rbp,%rax
  add    %rbx,%rax
  add    %r11,%rax
  add    %r10,%rax
  add    %r9,%rax
  add    %r8,%rax
  add    %rdi,%rax
  add    %rsi,%rax
  add    %rcx,%rax
  add    -0x28(%rsp),%rax
  add    -0x20(%rsp),%rax
  add    -0x10(%rsp),%rax
  add    %rdx,%rax
  add    %r15,%rax
  add    %rax,-0x18(%rsp)
  add    $0x10,%r12
  cmp    %r14,%r12
  jne    L169
  mov    -0x4(%rsp),%eax
  shl    $0x4,%eax
  neg    %eax
  mov    -0x8(%rsp),%edi
  lea    -0x11(%rdi,%rax,1),%eax
  test   $0xf,%dil
  je     L146
L127:
  mov    %eax,%eax
  lea    0x1(%r14,%rax,1),%rdx
  mov    -0x18(%rsp),%rax
L3:
  add    $0x1,%r14
  movzbl -0x1(%r14),%ecx
  add    %rcx,%r15
  add    %r15,%rax
  cmp    %rdx,%r14
  jne    L3
  mov    %rax,-0x18(%rsp)
L146:
  movabs $0xf00e10d2fc5cd,%rcx
  mov    %r15,%rax
  mul    %rcx
  mov    %r15,%rax
  sub    %rdx,%rax
  shr    %rax
  add    %rdx,%rax
  shr    $0xf,%rax
  imul   $0xfff1,%rax,%rax
  sub    %rax,%r15
  mov    -0x18(%rsp),%rax
  mul    %rcx
  mov    -0x18(%rsp),%rdi
  mov    %rdi,%rax
  sub    %rdx,%rax
  shr    %rax
  add    %rdx,%rax
  shr    $0xf,%rax
  imul   $0xfff1,%rax,%rax
  sub    %rax,%rdi
  mov    %rdi,-0x18(%rsp)
  jmp    L132
L21:
  mov    $0x1,%eax
  jmp    L76
L140:
  mov    -0x4(%rsp),%eax
  sub    $0x15b1,%eax
  mov    %rcx,%r14
  jmp    L127
```

assistant: ```c
unsigned long adler32(unsigned long adler, const unsigned char *buf, unsigned int len) {
  unsigned long sum2;
  unsigned n;
  sum2 = (adler >> 16) & 0xffff;
  adler &= 0xffff;
  if (len == 1) {
    adler += buf[0];
    if (adler >= 65521UL)
      adler -= 65521UL;
    sum2 += adler;
    if (sum2 >= 65521UL)
      sum2 -= 65521UL;
    return adler | (sum2 << 16);
  }
  if (buf == NULL)
    return 1L;
  if (len < 16) {
    while (len--) {
      adler += *buf++;
      sum2 += adler;
    }
    if (adler >= 65521UL)
      adler -= 65521UL;
    sum2 %= 65521UL;
    return adler | (sum2 << 16);
  }
  while (len >= 5552) {
    len -= 5552;
    n = 5552 / 16;
    do {
      {
        adler += (buf)[0];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[0 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      {
        adler += (buf)[0 + 4];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 4 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[0 + 4 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 4 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      ;
      {
        adler += (buf)[8];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[8 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      {
        adler += (buf)[8 + 4];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 4 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[8 + 4 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 4 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      ;
      ;
      buf += 16;
    } while (--n);
    adler %= 65521UL;
    sum2 %= 65521UL;
  }
  if (len) {
    while (len >= 16) {
      len -= 16;
      {
        adler += (buf)[0];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[0 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      {
        adler += (buf)[0 + 4];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 4 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[0 + 4 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[0 + 4 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      ;
      {
        adler += (buf)[8];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[8 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      {
        adler += (buf)[8 + 4];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 4 + 1];
        sum2 += adler;
      };
      ;
      {
        adler += (buf)[8 + 4 + 2];
        sum2 += adler;
      };
      {
        adler += (buf)[8 + 4 + 2 + 1];
        sum2 += adler;
      };
      ;
      ;
      ;
      ;
      buf += 16;
    }
    while (len--) {
      adler += *buf++;
      sum2 += adler;
    }
    adler %= 65521UL;
    sum2 %= 65521UL;
  }
  return adler | (sum2 << 16);
}
```