user: Please show me the C implementation that matches the assembly code listed below:

```asm
<RC2_decrypt>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%r9
  mov    (%rdi),%rdx
  movzwl %dx,%r11d
  shr    $0x10,%rdx
  mov    0x8(%rdi),%rbp
  movzwl %bp,%ecx
  shr    $0x10,%rbp
  mov    (%rsi),%r10
  lea    0xfc(%r10),%rsi
  mov    $0x3,%r8d
  mov    $0x5,%edi
L10:
  mov    %ebp,%eax
  shl    $0xb,%eax
  sar    $0x5,%ebp
  or     %ebp,%eax
  movzwl %ax,%eax
  mov    %ecx,%ebx
  not    %ebx
  and    %r11d,%ebx
  sub    %ebx,%eax
  mov    %edx,%ebx
  and    %ecx,%ebx
  sub    %ebx,%eax
  sub    (%rsi),%eax
  movzwl %ax,%ebp
  mov    %ecx,%r12d
  shl    $0xd,%r12d
  sar    $0x3,%ecx
  or     %ecx,%r12d
  movzwl %r12w,%r12d
  mov    %edx,%eax
  not    %eax
  and    %ebp,%eax
  sub    %eax,%r12d
  mov    %r11d,%eax
  and    %edx,%eax
  sub    %eax,%r12d
  sub    -0x4(%rsi),%r12d
  movzwl %r12w,%ecx
  mov    %edx,%ebx
  shl    $0xe,%ebx
  sar    $0x2,%edx
  or     %edx,%ebx
  movzwl %bx,%ebx
  mov    %r11d,%eax
  not    %eax
  and    %ecx,%eax
  sub    %eax,%ebx
  mov    %r11d,%eax
  and    %ebp,%eax
  sub    %eax,%ebx
  sub    -0x8(%rsi),%ebx
  movzwl %bx,%edx
  sub    $0x10,%rsi
  mov    %r11d,%eax
  shl    $0xf,%eax
  sar    %r11d
  or     %r11d,%eax
  movzwl %ax,%eax
  mov    %ebp,%r11d
  not    %r11d
  and    %edx,%r11d
  sub    %r11d,%eax
  mov    %ebp,%r11d
  and    %ecx,%r11d
  sub    %r11d,%eax
  sub    0x4(%rsi),%eax
  movzwl %ax,%r11d
  sub    $0x1,%edi
  jne    L10
  sub    $0x1,%r8d
  je     L2
  cmp    $0x2,%r8d
  sete   %dil
  movzbl %dil,%edi
  add    $0x5,%edi
  and    $0x3f,%r12d
  sub    (%r10,%r12,4),%ebp
  mov    %ebp,%r12d
  movzwl %bp,%ebp
  and    $0x3f,%ebx
  sub    (%r10,%rbx,4),%ecx
  movzwl %cx,%ecx
  and    $0x3f,%eax
  sub    (%r10,%rax,4),%edx
  movzwl %dx,%edx
  and    $0x3f,%r12d
  sub    (%r10,%r12,4),%r11d
  movzwl %r11w,%r11d
  jmp    L10
L2:
  shl    $0x10,%edx
  or     %r11d,%edx
  movslq %edx,%rax
  mov    %rax,(%r9)
  shl    $0x10,%ebp
  or     %ecx,%ebp
  movslq %ebp,%rax
  mov    %rax,0x8(%r9)
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
```

assistant: ```c
void RC2_decrypt(unsigned long *d, RC2_KEY *key) {
  int i, n;
  register RC2_INT *p0, *p1;
  register RC2_INT x0, x1, x2, x3, t;
  unsigned long l;
  l = d[0];
  x0 = (RC2_INT)l & 0xffff;
  x1 = (RC2_INT)(l >> 16L);
  l = d[1];
  x2 = (RC2_INT)l & 0xffff;
  x3 = (RC2_INT)(l >> 16L);
  n = 3;
  i = 5;
  p0 = &(key->data[63]);
  p1 = &(key->data[0]);
  for (;;) {
    t = ((x3 << 11) | (x3 >> 5)) & 0xffff;
    x3 = (t - (x0 & ~x2) - (x1 & x2) - *(p0--)) & 0xffff;
    t = ((x2 << 13) | (x2 >> 3)) & 0xffff;
    x2 = (t - (x3 & ~x1) - (x0 & x1) - *(p0--)) & 0xffff;
    t = ((x1 << 14) | (x1 >> 2)) & 0xffff;
    x1 = (t - (x2 & ~x0) - (x3 & x0) - *(p0--)) & 0xffff;
    t = ((x0 << 15) | (x0 >> 1)) & 0xffff;
    x0 = (t - (x1 & ~x3) - (x2 & x3) - *(p0--)) & 0xffff;
    if (--i == 0) {
      if (--n == 0)
        break;
      i = (n == 2) ? 6 : 5;
      x3 = (x3 - p1[x2 & 0x3f]) & 0xffff;
      x2 = (x2 - p1[x1 & 0x3f]) & 0xffff;
      x1 = (x1 - p1[x0 & 0x3f]) & 0xffff;
      x0 = (x0 - p1[x3 & 0x3f]) & 0xffff;
    }
  }
  d[0] = (RC2_INT)(x0 & 0xffff) | ((RC2_INT)(x1 & 0xffff) << 16L);
  d[1] = (RC2_INT)(x2 & 0xffff) | ((RC2_INT)(x3 & 0xffff) << 16L);
}
```