user: What is the c source code of the assembly code below?

```asm
<my_hashword2>:
  endbr64
  mov    %rsi,%r8
  mov    %rdx,%rsi
  mov    (%rdx),%eax
  lea    -0x21524111(%rax,%r8,4),%edx
  mov    %edx,%eax
  add    (%rcx),%eax
  cmp    $0x3,%r8
  jbe    L60
  mov    %edx,%r10d
L63:
  add    (%rdi),%edx
  add    0x4(%rdi),%r10d
  add    0x8(%rdi),%eax
  sub    %eax,%edx
  mov    %eax,%r9d
  shl    $0x4,%r9d
  mov    %eax,%r11d
  sar    $0x1c,%r11d
  or     %r11d,%r9d
  xor    %r9d,%edx
  add    %r10d,%eax
  sub    %edx,%r10d
  mov    %edx,%r9d
  shl    $0x6,%r9d
  mov    %edx,%r11d
  sar    $0x1a,%r11d
  or     %r11d,%r9d
  xor    %r10d,%r9d
  lea    (%rdx,%rax,1),%r11d
  sub    %r9d,%eax
  mov    %r9d,%edx
  shl    $0x8,%edx
  mov    %r9d,%r10d
  sar    $0x18,%r10d
  or     %r10d,%edx
  xor    %eax,%edx
  lea    (%r9,%r11,1),%r10d
  sub    %edx,%r11d
  mov    %edx,%eax
  shl    $0x10,%eax
  mov    %edx,%r9d
  sar    $0x10,%r9d
  or     %r9d,%eax
  xor    %r11d,%eax
  lea    (%rdx,%r10,1),%r9d
  sub    %eax,%r10d
  mov    %eax,%edx
  shl    $0x13,%edx
  mov    %eax,%r11d
  sar    $0xd,%r11d
  or     %r11d,%edx
  xor    %edx,%r10d
  lea    (%rax,%r9,1),%edx
  sub    %r10d,%r9d
  mov    %r10d,%eax
  shl    $0x4,%eax
  mov    %r10d,%r11d
  sar    $0x1c,%r11d
  or     %r11d,%eax
  xor    %r9d,%eax
  add    %edx,%r10d
  sub    $0x3,%r8
  add    $0xc,%rdi
  cmp    $0x3,%r8
  ja     L63
L25:
  cmp    $0x2,%r8
  je     L10
  cmp    $0x3,%r8
  je     L26
  cmp    $0x1,%r8
  jne    L68
  jmp    L24
L60:
  mov    %edx,%r10d
  jmp    L25
L26:
  add    0x8(%rdi),%eax
L10:
  add    0x4(%rdi),%r10d
L24:
  add    (%rdi),%edx
  xor    %r10d,%eax
  mov    %r10d,%edi
  shl    $0xe,%edi
  mov    %r10d,%r8d
  sar    $0x12,%r8d
  or     %r8d,%edi
  sub    %edi,%eax
  xor    %eax,%edx
  mov    %eax,%edi
  shl    $0xb,%edi
  mov    %eax,%r8d
  sar    $0x15,%r8d
  or     %r8d,%edi
  sub    %edi,%edx
  xor    %edx,%r10d
  mov    %edx,%edi
  shl    $0x19,%edi
  mov    %edx,%r8d
  sar    $0x7,%r8d
  or     %r8d,%edi
  sub    %edi,%r10d
  xor    %r10d,%eax
  mov    %r10d,%edi
  shl    $0x10,%edi
  mov    %r10d,%r8d
  sar    $0x10,%r8d
  or     %r8d,%edi
  sub    %edi,%eax
  xor    %eax,%edx
  mov    %eax,%edi
  shl    $0x4,%edi
  mov    %eax,%r8d
  sar    $0x1c,%r8d
  or     %r8d,%edi
  sub    %edi,%edx
  xor    %edx,%r10d
  mov    %edx,%edi
  shl    $0xe,%edi
  sar    $0x12,%edx
  or     %edi,%edx
  sub    %edx,%r10d
  xor    %r10d,%eax
  mov    %r10d,%edx
  shl    $0x18,%edx
  mov    %r10d,%edi
  sar    $0x8,%edi
  or     %edi,%edx
  sub    %edx,%eax
L68:
  mov    %eax,(%rsi)
  mov    %r10d,(%rcx)
  ret
```

assistant: ```c
void my_hashword2(const uint32_t *k, size_t length, uint32_t *pc, uint32_t *pb) {
  uint32_t a, b, c;
  a = b = c = 0xdeadbeef + ((uint32_t)(length << 2)) + *pc;
  c += *pb;
  while (length > 3) {
    a += k[0];
    b += k[1];
    c += k[2];
    {
      a -= c;
      a ^= (((c) << (4)) | ((c) >> (32 - (4))));
      c += b;
      b -= a;
      b ^= (((a) << (6)) | ((a) >> (32 - (6))));
      a += c;
      c -= b;
      c ^= (((b) << (8)) | ((b) >> (32 - (8))));
      b += a;
      a -= c;
      a ^= (((c) << (16)) | ((c) >> (32 - (16))));
      c += b;
      b -= a;
      b ^= (((a) << (19)) | ((a) >> (32 - (19))));
      a += c;
      c -= b;
      c ^= (((b) << (4)) | ((b) >> (32 - (4))));
      b += a;
    };
    length -= 3;
    k += 3;
  }
  switch (length) {
  case 3:
    c += k[2];
  case 2:
    b += k[1];
  case 1:
    a += k[0];
    {
      c ^= b;
      c -= (((b) << (14)) | ((b) >> (32 - (14))));
      a ^= c;
      a -= (((c) << (11)) | ((c) >> (32 - (11))));
      b ^= a;
      b -= (((a) << (25)) | ((a) >> (32 - (25))));
      c ^= b;
      c -= (((b) << (16)) | ((b) >> (32 - (16))));
      a ^= c;
      a -= (((c) << (4)) | ((c) >> (32 - (4))));
      b ^= a;
      b -= (((a) << (14)) | ((a) >> (32 - (14))));
      c ^= b;
      c -= (((b) << (24)) | ((b) >> (32 - (24))));
    };
  case 0:
    break;
  }
  *pc = c;
  *pb = b;
}
```