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

```asm
<rc2_decrypt>:
  endbr64
  push   %rbx
  mov    %rsi,%r9
  mov    %rdx,%r8
  movzbl 0x7(%rdx),%eax
  shl    $0x8,%eax
  movzbl 0x6(%rdx),%edx
  add    %edx,%eax
  movzbl 0x5(%r8),%edx
  shl    $0x8,%edx
  movzbl 0x4(%r8),%ecx
  add    %ecx,%edx
  movzbl 0x3(%r8),%ecx
  shl    $0x8,%ecx
  movzbl 0x2(%r8),%esi
  add    %esi,%ecx
  movzbl 0x1(%r8),%esi
  shl    $0x8,%esi
  movzbl (%r8),%r8d
  add    %r8d,%esi
  mov    $0x3f,%r10d
  mov    $0xf,%r8d
  jmp    L15
L10:
  mov    %edx,%r11d
  and    $0x3f,%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%eax
  mov    %ecx,%r11d
  and    $0x3f,%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%edx
  mov    %esi,%r11d
  and    $0x3f,%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%ecx
  mov    %eax,%r11d
  and    $0x3f,%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%esi
L1:
  sub    $0x1,%r8d
  sub    $0x4,%r10d
  cmp    $0xffffffff,%r8d
  je     L22
L15:
  movzwl %ax,%r11d
  mov    %r11d,%eax
  shl    $0xb,%eax
  shr    $0x5,%r11d
  add    %r11d,%eax
  mov    %edx,%r11d
  and    %ecx,%r11d
  sub    %r11d,%eax
  mov    %edx,%r11d
  not    %r11d
  and    %esi,%r11d
  sub    %r11d,%eax
  mov    %r10d,%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%eax
  movzwl %dx,%r11d
  mov    %r11d,%edx
  shl    $0xd,%edx
  shr    $0x3,%r11d
  add    %r11d,%edx
  mov    %ecx,%r11d
  and    %esi,%r11d
  sub    %r11d,%edx
  lea    -0x1(%r10),%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%edx
  mov    %ecx,%r11d
  not    %r11d
  and    %eax,%r11d
  sub    %r11d,%edx
  movzwl %cx,%r11d
  mov    %r11d,%ecx
  shl    $0xe,%ecx
  shr    $0x2,%r11d
  add    %r11d,%ecx
  lea    -0x2(%r10),%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%ecx
  mov    %esi,%r11d
  and    %eax,%r11d
  sub    %r11d,%ecx
  mov    %esi,%r11d
  not    %r11d
  and    %edx,%r11d
  sub    %r11d,%ecx
  movzwl %si,%r11d
  mov    %r11d,%esi
  shl    $0xf,%esi
  shr    %r11d
  add    %r11d,%esi
  lea    0x0(,%r8,4),%r11d
  mov    %r11d,%r11d
  movzwl (%rdi,%r11,2),%r11d
  sub    %r11d,%esi
  mov    %eax,%r11d
  and    %edx,%r11d
  sub    %r11d,%esi
  mov    %eax,%r11d
  not    %r11d
  and    %ecx,%r11d
  sub    %r11d,%esi
  cmp    $0x5,%r8d
  je     L10
  cmp    $0xb,%r8d
  jne    L1
  jmp    L10
L22:
  mov    %sil,(%r9)
  mov    %esi,%ebx
  movzbl %bh,%ebx
  mov    %bl,0x1(%r9)
  mov    %cl,0x2(%r9)
  movzbl %ch,%ebx
  mov    %bl,0x3(%r9)
  mov    %dl,0x4(%r9)
  movzbl %dh,%ebx
  mov    %bl,0x5(%r9)
  mov    %al,0x6(%r9)
  movzbl %ah,%eax
  mov    %al,0x7(%r9)
  pop    %rbx
  ret
```

assistant: ```c
void rc2_decrypt(const unsigned short xkey[64], unsigned char *plain, const unsigned char *cipher) {
  unsigned x76, x54, x32, x10, i;
  x76 = (cipher[7] << 8) + cipher[6];
  x54 = (cipher[5] << 8) + cipher[4];
  x32 = (cipher[3] << 8) + cipher[2];
  x10 = (cipher[1] << 8) + cipher[0];
  i = 15;
  do {
    x76 &= 65535;
    x76 = (x76 << 11) + (x76 >> 5);
    x76 -= (x10 & ~x54) + (x32 & x54) + xkey[4 * i + 3];
    x54 &= 65535;
    x54 = (x54 << 13) + (x54 >> 3);
    x54 -= (x76 & ~x32) + (x10 & x32) + xkey[4 * i + 2];
    x32 &= 65535;
    x32 = (x32 << 14) + (x32 >> 2);
    x32 -= (x54 & ~x10) + (x76 & x10) + xkey[4 * i + 1];
    x10 &= 65535;
    x10 = (x10 << 15) + (x10 >> 1);
    x10 -= (x32 & ~x76) + (x54 & x76) + xkey[4 * i + 0];
    if (i == 5 || i == 11) {
      x76 -= xkey[x54 & 63];
      x54 -= xkey[x32 & 63];
      x32 -= xkey[x10 & 63];
      x10 -= xkey[x76 & 63];
    }
  } while (i--);
  plain[0] = (unsigned char)x10;
  plain[1] = (unsigned char)(x10 >> 8);
  plain[2] = (unsigned char)x32;
  plain[3] = (unsigned char)(x32 >> 8);
  plain[4] = (unsigned char)x54;
  plain[5] = (unsigned char)(x54 >> 8);
  plain[6] = (unsigned char)x76;
  plain[7] = (unsigned char)(x76 >> 8);
}
```